53 votes

Attribut .NET DefaultValue

J'ai entendu des gens dire différentes choses à propos de l'attribut DefaultValue notamment:

  • "Il définit la valeur de la propriété avant que quiconque ne l'utilise."
  • "Cela ne fonctionne pas pour les autoproperties."
  • "Ce n'est que pour la décoration. Vous devez définir manuellement les valeurs réelles par défaut."

Lequel (le cas échéant) a raison? Est-ce que DefaultValue définit réellement les valeurs par défaut? Y a-t-il des cas où cela ne fonctionne pas? Est-il préférable de ne pas l'utiliser?

54voto

STW Points 15326

L'endroit où j'ai généralement utilisé DefaultValue est pour les classes qui sont sérialisés/désérialisé à XML. Il ne permet pas de définir la valeur par défaut lors de l'instanciation et n'a pas d'impact autoproperties.

À partir de MSDN:

Un DefaultValueAttribute ne sera pas causer un membre sera automatiquement initialisé avec la valeur de l'attribut. Vous devez définir la valeur initiale dans votre code.

MSDN - DefaultValueAttribute Classe


Edit: Comme Roland points, et, comme d'autres l'ont mentionné dans leurs réponses, l'attribut est également utilisé par le Concepteur de Formulaire

17voto

John Hatton Points 722

Pour mettre à jour cette information quatre ans plus tard: À l'heure actuelle, la définition du paramètre DefaultValueHandling de JSON.net fait que DefaultValue fonctionne comme prévu par @aaron:

 [JsonProperty("allowUploading",DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue(true)]
public bool AllowUploading { get; set; }
 

12voto

Rowland Shaw Points 22860

Comme tous les attributs de méta-données, et en tant que tel "C'est seulement pour la décoration. Vous devez définir manuellement réelles valeurs par défaut." est la plus proche.

MSDN continue à dire à propos de DefaultValueAttribute:

Un DefaultValueAttribute ne sera pas causer un membre sera automatiquement initialisé avec la valeur de l'attribut. Vous devez définir la valeur initiale dans votre code.

c'est à dire Vous avez encore besoin de faire le constructeur correspondre à ce que vous dites est la valeur par défaut de sorte que le code qui fait confiance, il fonctionne encore, tels que le bâti de la Sérialisation XML va les utiliser pour travailler si à serialise la propriété ou non; de même le concepteur de formulaire va utiliser l' DefaultValues à travailler sur ce code doit être généré automatiquement.

2voto

gsharp Points 4704

"Il définit la valeur de la propriété avant que quiconque ne l'utilise." -> Non, la valeur par défaut est réservée au concepteur. une valeur par défaut ne sera pas sérialisée dans le code du concepteur.

"Cela ne fonctionne pas pour les autoproperties." -> non

"Ce n'est que pour la décoration. Vous devez définir manuellement les valeurs réelles par défaut." -> Non, à cause de la sérialisation du concepteur. Mais vous devez le définir manuellement.

1voto

Adam Points 11

De l'aide MSDN :

 AttributeCollection^ attributes = TypeDescriptor::GetProperties( this )[ "MyProperty" ]->Attributes;

/* Prints the default value by retrieving the DefaultValueAttribute 
      * from the AttributeCollection. */
DefaultValueAttribute^ myAttribute = dynamic_cast<DefaultValueAttribute^>(attributes[ DefaultValueAttribute::typeid ]);
Console::WriteLine( "The default value is: {0}", myAttribute->Value );
 

Je dois définir l'attribut de valeur par défaut sur quelque chose de non statique. Comment puis-je fondamentalement le définir quand je veux?


Résolu en remplaçant les fonctions ShouldSerialize dans la classe contenant les propriétés.

Exemple:

 property System::String^ Z {
            System::String^ get(){...}
            void set(System::String^ value) {...}
        }

        bool ShouldSerializeZ() {
            return Z != <call to run time objects>
        }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X