web-dev-qa-db-fra.com

Déclaration Getter et Setter dans .NET

Je me demandais quelles étaient les différences entre ces déclarations de getters et de setters et s’il existait une méthode privilégiée (et pourquoi). Le premier peut être généré automatiquement par Visual Studio. Qu'en est-il des autres? Merci

1er

string _myProperty { get; set; }

2ème

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

3ème

string _myProperty;

public string getMyProperty()
{
  return this._myProperty;
}

public void setMyProperty(string value)
{
  this._myProperty = value;
}
129
WizLiz

Les propriétés sont utilisées pour encapsuler certaines données. Vous pouvez utiliser un champ simple:

public string MyField

Mais ce champ est accessible à tous les utilisateurs extérieurs à votre classe. Les gens peuvent insérer des valeurs illégales ou modifier la valeur d'une manière inattendue.

En utilisant une propriété, vous pouvez encapsuler le mode d'accès à vos données. C # a une syntaxe de Nice pour transformer un champ en propriété:

string MyProperty { get; set; }

Cela s'appelle un propriété implémentée automatiquement . Lorsque le besoin s'en fait sentir, vous pouvez agrandir votre propriété pour:

string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

Maintenant, vous pouvez ajouter du code qui valide la valeur dans votre setter:

set
{
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentNullException();

    _myProperty = value;
}

Les propriétés peuvent également avoir différents accesseurs pour le getter et le setter:

public string MyProperty { get; private set; }

De cette façon, vous créez une propriété qui peut être lue par tout le monde mais ne peut être modifiée que par la classe elle-même.

Vous pouvez également ajouter une implémentation entièrement personnalisée pour votre getter:

public string MyProperty
{
    get
    {
        return DateTime.Now.Second.ToString();
    }
}

Lorsque C # compile votre propriété implémentée automatiquement, il génère un langage intermédiaire (IL). Dans votre IL, vous verrez une méthode get_MyProperty et set_MyProperty. Il crée également un champ de sauvegarde appelé <MyProperty>k_BackingField (normalement ce nom est illégal en C # mais en IL, il est valide. Ainsi, vous ne rencontrerez aucun conflit entre les types générés et votre propre code). Cependant, vous devez utiliser la syntaxe de propriété officielle en C #. Cela crée une expérience plus agréable en C # (par exemple avec IntelliSense).

Par convention, vous ne devriez pas utiliser de propriétés pour des opérations qui prennent beaucoup de temps.

185
Wouter de Kort

Eh bien, le premier et le second génèrent tous deux quelque chose comme le troisième à la fin. Cependant, n'utilisez pas le troisième lorsque vous avez une syntaxe pour les propriétés.

Enfin, si vous n'avez pas de travail à faire dans les get ou set, utilisez le premier.

En fin de compte, le premier et le second ne sont qu'une forme de sucre syntaxique, mais pourquoi coder plus que nécessaire.

// more code == more bugs

Et juste pour vous amuser un peu, considérez ceci:

public string A { get; private set; }

Maintenant, c'est beaucoup plus simple n'est-ce pas? Le modificateur public est implicite à la fois sur le get et le set, mais il peut être remplacé. Ce serait bien sûr la même règle pour tout modificateur utilisé lors de la définition de la propriété elle-même.

12
Mike Perrenoud

1er

string _myProperty { get; set; }

Cela s'appelle un Auto Property dans le monde .NET. C'est juste du sucre syntaxique pour # 2.

2ème

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

C'est la manière habituelle de le faire, ce qui est nécessaire si vous devez effectuer une validation ou un code supplémentaire dans votre propriété. Par exemple, dans WPF si vous devez déclencher un événement de propriété modifiée. Si vous ne le faites pas, utilisez simplement la propriété auto, elle est plutôt standard.

3

string _myProperty;

public string getMyProperty()
{
    return this._myProperty;
}

public string setMyProperty(string value)
{
    this._myProperty = value;
}

Le mot clé this est redondant. Pas besoin du tout. Ce ne sont que des méthodes qui obtiennent et définissent par opposition à des propriétés, comme la façon de faire les choses Java.

9
Andrew Grothe

Avec cela, vous pouvez exécuter du code dans la portée get ou set.

private string _myProperty;
public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

Vous pouvez également utiliser les propriétés automatiques:

public string myProperty
{
    get;
    set;
}

Et .Net Framework se chargera de vous. C'était créer parce que c'est une bonne pratique et le rend facile à faire.

Vous pouvez également contrôler la visibilité de ces étendues, par exemple:

public string myProperty
{
    get;
    private set;
}

public string myProperty2
{
    get;
    protected set;
}

public string myProperty3
{
    get; 
}

Mise à jour

Maintenant en C #, vous pouvez initialiser la valeur d'une propriété. Comme échantillon:

public int Property { get; set; } = 1;

Si aussi peut le définir et le rendre en lecture seule, sans ensemble.

public int Property { get; } = 1;

Et enfin, vous pouvez définir une fonction de flèche.

public int Property { get; } => GetValue();
5
Felipe Oriani

Juste pour clarifier, dans votre troisième exemple, _myProperty n'est pas réellement une propriété. C'est un champ avec les méthodes get et set (et comme cela a déjà été mentionné, les méthodes get et set doivent spécifier les types de retour).

En C #, la 3ème méthode doit être évitée dans la plupart des situations. Vous ne l'utiliserez vraiment que si le type que vous voulez renvoyer est un tableau ou si la méthode get effectue beaucoup de travail plutôt que de simplement renvoyer une valeur. Ce dernier point n'est pas vraiment nécessaire, mais pour des raisons de clarté, la méthode get d'une propriété faisant beaucoup de travail est trompeuse.

2
OnABauer

Commençons par 3. Cela ne fonctionnerait pas. public getMyProperty() n'a pas de retour typ.

Et les numéros 1 et 2 sont en réalité les mêmes choses. 2 est ce que le numéro 1 devient après la compilation.

Donc, 1 et 2 sont les mêmes choses. avec deux, vous pouvez avoir une validation ou une mise en cache dans votre modèle.

à part cela, ils deviennent identiques.

1
DarthVader

Le premier est par défaut, lorsqu'il n'y a rien de spécial à retourner ou à écrire. 2ème et 3ème sont fondamentalement les mêmes où 3ème est une version un peu plus développée de 2nd

0
NG.

Le premier est le "court" formulaire - vous l'utilisez, lorsque vous ne voulez pas faire quelque chose d'extraordinaire avec vos accesseurs et vos passeurs. Il n'est pas possible d'exécuter une méthode ou quelque chose comme ça sous cette forme.

Les deuxième et troisième formes sont presque identiques, bien que la seconde soit comprimée sur une ligne. Stylecop décourage cette forme car elle a un aspect un peu bizarre et ne correspond pas à C 'Stylguides.

J'utiliserais le troisième formulaire si je m'attendais à utiliser mes getters/setters pour quelque chose de spécial, par exemple. utilisez une construction paresseuse ou autre.

0
Christian Sauer