Si les propriétés get et set sont obligatoires dans les propriétés automatiques C #, pourquoi dois-je me donner la peine de spécifier "get; set;" du tout?
Réponses
Trop de publicités?ERREUR: UNE propriété ou d'indexation ne peut être adopté comme une sortie ou paramètre de référence
Si vous n'avez pas à spécifier {get; set;}
alors que le compilateur ne sais pas si c'est un champ ou une propriété.
Ceci est important parce que pendant qu'ils "look" à l'identique le compilateur traite différemment. par exemple, en Appelant "InitAnInt" sur la propriété génère une erreur.
class Test
{
public int n;
public int i { get; set; }
public void InitAnInt(out int i)
{
i = 100;
}
public Test()
{
InitAnInt(out n); // This is OK
InitAnInt(out i); // ERROR: A property or indexer may not be passed
// as an out or ref parameter
}
}
Vous ne devriez pas créer des champs publics et des Variables sur les classes, vous ne savez jamais quand vous aurez envie de le changer pour avoir get et set accesseurs, et puis vous ne savez pas ce code, vous allez briser, surtout si vous avez des clients qui programme à l'encontre de votre API.
Aussi, vous pouvez avoir différents modificateurs d'accès pour le get et set, par exemple {get; private set;}, le public et l'ensemble privée à la classe de déclaration.
Juste pensé que je voudrais partager mes découvertes sur ce sujet.
Le codage d'un bien comme les suivantes, est un .net 3.0 raccourci d'appel "auto-mise en œuvre de la propriété".
public int MyProperty { get; set; }
Cela vous permet d'économiser un peu de temps. Le long de la façon de déclarer une propriété est comme ceci:
private int myProperty;
public int MyProperty
{
get { return myProperty; }
set { myProperty = value; }
}
Lorsque vous utilisez la fonction "auto-mise en œuvre de propriété", le compilateur génère le code pour raccorder le get et set pour certains "k_BackingField". Ci-dessous est le code désassemblé l'aide d'un Réflecteur.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
[CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
démonté le code C# de IL
Aussi les fils en place une méthode pour le setter et getter.
[CompilerGenerated]
public void set_MyProperty(int value)
{
this.<MyProperty>k__BackingField = value;
}
[CompilerGenerated]
public int get_MyProperty()
{
return this.<MyProperty>k__BackingField;
}
démonté le code C# de IL
Lorsque vous déclarez une lecture que l'auto-mise en œuvre de la propriété, par la mise en au setter privé:
public int MyProperty { get; private set; }
Tout le compilateur ne le drapeau de la "ensemble" comme privé. Le setter et getter méthode de dire la même chose.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
private [CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
démonté le code C# de IL
Donc, je ne suis pas sûr de savoir pourquoi le cadre exiger de l'obtenir; et; d'une auto-mise en œuvre de la propriété. Ils pourraient tout simplement pas écrit l'ensemble et de définition de la méthode, si elle n'a pas été fourni. Mais il peut y avoir certains compilateur problème de niveau qui rend cela difficile, je ne sais pas.
Si vous regardez le long chemin de la déclaration d'une propriété en lecture seule:
public int myProperty = 0;
public int MyProperty
{
get { return myProperty; }
}
Et puis regardez le code désassemblé. Le setter est pas là du tout.
public int Test2
{
get
{
return this._test;
}
}
public int get_Test2()
{
return this._test;
}
démonté le code C# de IL