2010-07-16 6 views
4

Cela doit avoir été demandé à plusieurs reprises mais je ne le trouve pas .... désolé ...valeurs initiales sur {get; ensemble;} accesseurs (VS 2010 C#)

Pourquoi est le suivant pas permis ? Public string MyString = "valeur initiale" {get; ensemble privé;}

(Visual C# Express 2010)

+1

Malheureux qui n'est pas possible de faire actuellement - mais il ne serait pas dommageable pour ajouter la capacité dans les futures versions C# - J'espère qu'ils ne correspondent en avenir. (Et ajouter la possibilité de créer des propriétés auto readonly) –

+1

Il serait particulièrement agréable de pouvoir marquer des propriétés avec des champs de sauvegarde automatique pour rendre le champ de sauvegarde 'readonly'. À ce stade, nous pourrions initialiser à travers la propriété mais seulement dans le constructeur. Cela a été discuté sur SO avant. –

+0

Enfin, une fonctionnalité où VB permet une syntaxe plus concise! Dans VB10, 'Propriété publique MyString As String =" valeur initiale "' fonctionne. – Heinzi

Répondre

1

Dans VS 2017, vous pouvez:

public int Minimum { get; private set; } = 0; 
    public int Maximum { get; set; } = 5; 
1

C'est une propriété, pas un champ. Vous ne pouvez pas l'initialiser de cette façon. Définissez simplement la valeur dans le constructeur.

5

La syntaxe n'est pas valide. Vous ne pouvez pas initialiser la valeur d'une propriété automatique, malheureusement.

Les meilleures options sont soit rendre la propriété manuellement:

private string _MyString = "initial value"; 
public string MyString { get { return _MyString; } set { _MyString = value; } } 

ou initialiser la valeur dans le constructeur:

public string MyString { get; set; } 

.... 

public MyClass() { 
    MyString = "initial value"; 
} 
+0

Je comprends qu'il y a plusieurs façons. Je me demandais juste pourquoi il n'y avait pas encore de syntaxe valide (encore). Le problème avec la méthode ci-dessus est la déclaration et l'initialisation sont séparés, peut-être par beaucoup, beaucoup de lignes de code, j'aime la syntaxe de @ apollodude217 ci-dessous – Paulustrious

2

Une alternative:

string _strMyString; 

public string MyString 
{ 
    get { 
     if (String.IsNullOrEmpty(_strMyString) { 
      return "initial value"; 
     } else { 
      return _strMyString; 
     } 
} 
+0

String.IsNullOrEmpty – Tergiver

+1

J'oublie toujours cette méthode. –

+3

OrEmpty interrompt votre application lorsque vous la définissez sur une chaîne vide. –

1

la syntaxe

public string MyString { get; set; } 

remplace le style ancien/ennuyeux/trivial (comme de VS2008/C# 3.0, vous pouvez voir toutes les nouvelles fonctionnalités de C# 3,0 here)

private string _MyString; 

public string MyString 
{ 
    get { return _MyString; } 
    set { _MyString = value; } 
} 

le compilateur est génère en fait un membre avant de compiler votre code . vous pouvez ouvrir un réflecteur et voir le membre généré.

1

Pourquoi?

Je ne peux pas parler au nom des concepteurs de C#, mais je peux faire la spéculation éduquée:

  1. Ils voulaient voir à quel point un gros problème, il est avant de prendre le temps de ajouter un autre fonctionnalité et encore une autre règle à la langue.
  2. Ils ne pouvaient pas trouver un moyen suffisamment élégant pour faire cela.

Cela dit, voici comment je permettrais des valeurs (quand un accesseur est disponible, bien sûr):

public string MyProp {get;set;} = "initial value"; // not valid C# 

Sans faire la langue plus complexe, ils pourraient écrire la règle de telle sorte que il applique à « [tout] propriétés avec l'ensemble accesseurs » au lieu de « propriétés par défaut avec l'ensemble accesseurs »:

// again, not valid C#: 
public string MyProp 
{ 
    get { return _MyProp;} 
    set { _MyProp = value; } 
} = "initial value before being massaged or rejected by the set accessor."; 

Le seul inconvénient que je vois ici est qu'il est laid. Les avantages sont que vous pouvez spécifier de manière concise une valeur initiale pour une propriété avec cette propriété plutôt que dans le constructeur, et que vous pouvez laisser la valeur être massée/vérifiée/tout via le constructeur à l'exécution si vous le souhaitez.

+0

J'ai préféré votre syntaxe jusqu'à ce que je ai vu {perdu du code – Paulustrious

+0

Désolé - pas assez de réputation pour éditer mes propres commentaires après avoir oublié CR messages le message. – Paulustrious

+0

Vous aviez raison! – Paulustrious