2010-06-30 2 views
5

J'ai lu qu'il y a de bonnes raisons d'utiliser des propriétés au lieu de champs dans C# sur SO. Donc maintenant je veux convertir mon code d'utiliser les champs pour utiliser les propriétés.Existe-t-il un moyen élégant de définir une valeur par défaut pour une propriété dans C#?

Pour un champ d'instance d'une classe, je peux définir une valeur par défaut. Par exemple:

int speed = 100; 

Pour la propriété équivalente, qui je pense est:

int Speed { get; set; } 

Ma compréhension est que la propriété de vitesse sera initialisée à zéro lorsque la classe est instancié. J'ai été incapable de trouver comment définir une valeur par défaut pour facilement mettre à jour mon code. Existe-t-il un moyen élégant de fournir une valeur par défaut pour une propriété?

Il semble qu'il devrait y avoir une manière élégante de faire ceci, sans employer un constructeur, mais je ne peux juste pas savoir comment.

+0

Quel est le problème avec l'aide d'un constructeur? Ou en utilisant une propriété avec un champ de sauvegarde défini manuellement au lieu d'une auto-propriété? –

+0

Cela rendrait ma tâche de conversion plus facile si je pouvais changer le champ en une propriété au même endroit que le champ précédemment déclaré. En utilisant un constructeur, je devrais faire défiler mon code pour faire le changement. Je n'étais pas au courant que vous pouviez utiliser un champ de sauvegarde initialisé. –

+0

Nouveau dans C# 6: [Initializers pour auto-propriétés] (https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#auto-property-enhancements) –

Répondre

7

meilleur pari est de faire une propriété soutenue sur le terrain à l'ancienne normale, comme:

private int _speed = 100; 
public int Speed { get { return _speed; } set { _speed = value; } } 
+0

Merci pour le code. C'est assez élégant et je n'ai pas besoin d'utiliser un constructeur. Brillant. –

+0

Pas de problème. C'est ce que vous verrez tout le temps pour le code écrit avant .NET 3.0. Avec 3.0, la propriété auto a été introduite, mais vous rencontrez exactement le problème que vous avez soulevé, où vous ne pouvez pas définir une valeur par défaut simplement, sans utiliser le constructeur. –

+0

J'aime toujours l'ancienne façon de faire des propriétés, mais cela peut causer de la confusion parce que vous ne savez pas de quelle façon obtenir/définir la valeur à partir de la classe. Utilisez-vous la variable d'instance ou utilisez-vous la propriété? –

1

Vous devez définir la valeur par défaut de la propriété dans le constructeur. Il n'y a pas d'autre moyen de le faire en dehors de cela pour les propriétés automatiques puisque les champs pour les accessoires automatiques sont déclarés à la compilation et remplacés dans getter/setter. Cependant, dans les propriétés explicites, vous pouvez initialiser le champ que la propriété utilise pour lire ou écrire comme Joe mentionné dans sa réponse.

0

Le constructeur est la seule façon de définir la valeur initiale d'une propriété auto.

1

CciSharp prend en charge DefaultValue attribute, ce qui permet de placer les valeurs par défaut sur les propriétés automatiques. Que CciSharp se qualifie comme une solution "élégante", cependant, est une question d'opinion (elle agit comme un post-compilateur qui édite l'IL dans le binaire).

2

Le motif de dessin que j'utilise, qui est utilisé dans les contrôles Windows.Forms de Microsoft et dans les autres classes .NET. De plus, d'après ce que je comprends, l'initialisation en dehors du constructeur permet au compilateur juste-à-temps d'optimiser le code de classe.

public class Foo { 
    public static const int DefaultSpeed = 100; 
    private int _speed = DefaultSpeed; 
    [DefaultValue(DefaultSpeed)] 
    public int Speed { get { return _speed; } set { _speed = value; } } 
} 

public class Foo { 
     public static Color DefaultForecolor { get {return SystemColors.WindowText; }} 
     private Color _forecolor = DefaultForecolor; 
     [DefaultValue(DefaultForeColor)] 
     public Color Forecolor { get { return _forecolor; } set { _forecolor = value; } } 
    } 
Questions connexes