Comprend pas la mécanique des Attributes

Comprend pas la mécanique des Attributes - C#/.NET managed - Programmation

Marsh Posté le 24-08-2002 à 11:37:08    

Bonjour,
 
je suis en train d'apprendre C#, et il y a un truc qui me semble cryptique : la notion d'Attribute (17.2 dans la c# specification, pas l'attribut dans qu'on le connais en java et c++ donc).
 
Dans mon code, je déclare un nouveau type d'attribut TestAttribute contenant une propriété int.
 
Je l'applique sur ma classe Hello en l'initialisant à 10.
 
Et dans la fonction main, je tente de l'utiliser. Ca ne compile même pas.
 
Il me semblais avoir compris qu'un attribute était une déclaration d'attibut de haut niveau, que l'on pouvait ensuite insérer dans une classe. C'est bien le cas ? Et comment ça s'utilise exactement ?
 

Code :
  1. using System;
  2. namespace Hello{
  3.   [AttributeUsage(AttributeTargets.Class)]
  4.   public class TestAttribute : Attribute {
  5.     public TestAttribute (int i) {
  6.       Truc = i;
  7.     }
  8.     private int truc;
  9.     public int Truc {
  10.       get {
  11. return truc;
  12.       }
  13.       set {
  14. truc = value;
  15.       }
  16.     }
  17.   }
  18.   [TestAttribute(10)]
  19.   class Hello {
  20.     public Hello () {
  21.      
  22.     }
  23.    
  24.     private string prop = "";
  25.     public string Prop {
  26.       get {
  27. return prop;
  28.       }
  29.       set {
  30. prop = value;
  31.       }
  32.     }
  33.    
  34.     static int Main (string[] args) {
  35.       Hello hello = new Hello ();
  36.       System.Console.WriteLine ("Hello : begin {0}", hello.Prop);
  37.       hello.Prop = "coin ! coin ! ";
  38.       System.Console.WriteLine ("Hello : end {0}", hello.Prop);
  39.       System.Console.WriteLine ("Valeur attribute Truc : {0}", hello.Truc);
  40.       return 0;
  41.     }
  42.   } 
  43. }


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 24-08-2002 à 11:37:08   

Reply

Marsh Posté le 24-08-2002 à 11:38:48    

kadreg a écrit a écrit :

 
je suis en train d'apprendre C#




 
:ouch: je te crois pas :D


Message édité par antp le 24-08-2002 à 11:38:56

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-08-2002 à 11:41:25    

antp a écrit a écrit :

 
:ouch: je te crois pas :D




 
Pourquoi ? Un peu de culture ne fait pas de mal. Je travaille en java/J2EE/EJB, et être capable d'avoir des points de comparaisons avec les systèmes concurents est important.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 24-08-2002 à 11:47:18    

c'était pour rire ;)
bah j'ai bien essayé Visual Basic (5 minutes... :D)


Message édité par antp le 24-08-2002 à 11:47:41

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-08-2002 à 11:51:23    

Bah oui mais VB c'est pas un langage, c'est juste une vaste blague.

Reply

Marsh Posté le 24-08-2002 à 11:56:32    

:D
on va peut-être arrêter de pourrir le topic là [:titprem]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-08-2002 à 12:01:11    

Bon, vous allez pas troller dans mon topic non [:tapai]
 
Bon, je crois avoir compris. Les attributs de ce types sont définis au niveau de la metaclasse, et il faut jouer de la reflexivité pour y acceder.
 

Code :
  1. System.Reflection.MemberInfo info = typeof(Hello);
  2.       object[] attributes = info.GetCustomAttributes(true);
  3.       for (int i = 0; i < attributes.Length; i ++) {
  4.          System.Console.WriteLine("Attribute ", attributes[i]);
  5.       }


 
Par contre, ces attributs ne sont instanciés que lorsque l'on tente d'y acceder par getCustomAttributes. Bizarre comme truc. Quelqu'un sait dans quels cas on utilise ce type de système ?


Message édité par kadreg le 24-08-2002 à 12:01:39

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 24-08-2002 à 14:06:58    

Je capte pas vraiment ce que t'as tenté de faire dans ton code... :??:
 
Comprendre comment ça marche et à quoi ça sert :)
 
Donc, déclarer un attribute (TestAttribute) pour linstancier dans la classe Hello.
 
Déjà, à aucun moment tu initialises la valeur de ton attribut avec un .set()
 
La ligne [TestAttribute(10)]  est sensée créer et initialiser cet attribut. D'ailleurs, elle le fait, si je met une trace sans l'accesseur en ecriture de truc, je vois l'initialization.
 
 
Et ensuite, pour récupérer, tu n'a pas surchargé la méthode par défaut, donc il ne peux pas inventer que tu veux un .get(), donc il lits direct dans la valeur, et vu qu'elle n'est pas initialisée, ça ne peux pas marcher.
 
C'est une propriétée. La valeur est contenue dans truc, mais j'ai déclarée une propriétée Truc qui me permet d'y acceder proprement.
 
PS: Un type d'attribut avec un .set et un .get, généralement, sa valeur est privée, sinon ça sert à rien ;)
 
C'est une propriété, l'appel à set/get est donc sous entendu. Si je fait Truc = 3, Ca appel setTruc (3) qui affecte 3 à truc.
 
Et aussi... A quel moment tu dis que "Prop" ou "Truc" est un attribut :??:
 

Code :
  1. private string prop = "";
  2.    public string Prop {
  3.      get {
  4.         return prop;
  5.      }
  6.      set {
  7.         prop = value;
  8.      }
  9.    }


 
Parceque là, je trouve ça bizarre
 
Moi aussi j'ai du mal a comprendre ce qui se passe. Mais la question porte sur l'utilisation de Truc dans une instance de Hello.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 24-08-2002 à 14:10:22    

je me suis en effet rendu compte que j'étais totalement à la rue, c'est pour ça que j'avais effacé :D
 
désolé je n'utilise jamais ça.
ça sert à koi exactement de déclarer tes attributs comme ça ?
 
car il me semble que tu peux surcharger la lecture d'un atribut de base (une simple variable public) dans une class par des methodes qui font les tests de validité nécessaires (me souvient plus comment par contre :D)


Message édité par MagicBuzz le 24-08-2002 à 14:11:33
Reply

Marsh Posté le 24-08-2002 à 14:16:03    

MagicBuzz a écrit a écrit :

 
ça sert à koi exactement de déclarer tes attributs comme ça ?




 
C'est aussi ce que je me demande. J'ai l'impression que ce type d'attributs (qui sont sur la metaclasse) sont destinés à des modifications dynamiques de métaclasses (comme en smalltalk). Mais je ne voit pas ce que ça fait en page 86 d'un livre introduction sur c# dans ce cas.
 
J'ai envie d'envoyer un mail à l'auteur du livre pour savoir si il a compris ce qu'il a écrit :D


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 24-08-2002 à 14:16:03   

Reply

Marsh Posté le 24-08-2002 à 14:19:56    

Ben bon courage :D :pt1cable:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed