WarptenLe 21/05/2016 à 16:34
De mémoire à la compilation yield se transforme en énumérable, faudra que je passe un coup de reflector à l'occasion.
Pour les attributs, l'intérêt principal ça reste la séralisation quand on commence à toucher à Reflection (Comme en Java, mais tellement mieux à mon sens).
Je m'en sers par exemple pour indiquer à une de mes classes qui lit des fichiers binaires l'ordre dans lequel les champs d'une structure sont définis; on peut aussi s'en servir pour donner des noms plus verbieux à des enums lorsqu'ils sont convertis en string (via une méthode d'extension sur les Enums, pour assurer le coup)
Un exemple?
public static string ToEncodingString(this EncodingFormat en)
{
var type = en.GetType();
var memInfo = type.GetMember(en.ToString());
if (memInfo.Length == 0)
return en.ToString();
var attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),
false);
return attrs.Length > 0 ? ((DescriptionAttribute)attrs[0]).Description : en.ToString();
}
[Serializable]
public enum EncodingFormat
{
[Description("MP3 (128 Kbps)")]
MP3_128 = 1,
[Description("MP3 (320 Kbps)")]
MP3_320 = 3,
[Description("MP3 (256 Kbps)")]
MP3_256 = 5,
[Description("AAC (64 Kbps)")]
AAC_64 = 6,
[Description("MP3 (192 Kbps)")]
MP3_192 = 7,
[Description("AAC (96 Kbps)")]
AAC_96 = 8,
[Description("FLAC")]
FLAC = 9,
[Description("MP3 (64 Kbps)")]
MP3_64 = 10,
[Description("MP3 (32 Kbps)")]
MP3_32 = 11
}
L'attribute DescriptionAttribute est standard dans le .NET, mais on peut définir ses propres attributs en déclarant des classes dérivées de System.Attribute. Le nom de termine par convention par "Attribute", mais la syntaxic sugar autorise d'"oublier" cette partie du nom dans l'assignation d'un attribut.
On peut vraiment faire plein de trucs avec les attributs, faut juste se rappeller que reflection est loin d'être rapide (sans être abyssallement lent)