44 votes

Propriétés automatiques C # - Pourquoi dois-je écrire "get; set;"?

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?

64voto

Brian Genisio Points 30777

Parce que vous voudrez peut-être une propriété en lecture seule:

public int Foo {get; ensemble privé; }

Ou en écriture seule:

public int Foo {private get; ensemble; }

52voto

Binary Worrier Points 27424

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.

17voto

Ron Todosichuk Points 246

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

16voto

Cristian Libardo Points 7425

Parce que vous avez besoin d'un moyen de le distinguer des champs ordinaires.

Il est également utile d’avoir différents modificateurs d’accès, par exemple

 public int MyProperty { get; private set; }
 

4voto

Kris Points 11892

Le compilateur doit savoir si vous souhaitez générer un getter et / ou un configurateur, ou peut-être déclarer un champ.

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