170 votes

Déclaration Getter et Setter en .NET

Je me demandais quelles étaient les différences entre ces déclarations de getters et setters et s'il y avait une méthode préférée (et pourquoi). La première peut être générée 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;
}

232voto

Wouter de Kort Points 17184

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

public string MyField

Mais ce champ est accessible à tous les utilisateurs extérieurs de votre classe. Les gens peuvent insérer des valeurs illégales ou modifier la valeur d'une manière que vous n'aviez pas prévue.

En utilisant une propriété, vous pouvez encapsuler la manière dont vos données sont accédées. C# dispose d'une belle syntaxe pour transformer un champ en une propriété :

string MyProperty { get; set; }

C'est ce qu'on appelle un propriété auto-implémentée . 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 des accesseurs différents 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 qui ne peut être modifiée que par la classe elle-même.

Vous pouvez également ajouter une implémentation complètement personnalisée pour votre getter :

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

Lorsque C# compile votre propriété auto-implémentée, il génère un langage intermédiaire (IL). Dans votre IL, vous verrez un get_MyProperty y set_MyProperty méthode. Il crée également un champ de sauvegarde appelé <MyProperty>k_BackingField (normalement, ce serait un nom illégal en C# mais en IL, il est valide. De cette façon, vous n'aurez pas de conflits entre les types générés et votre propre code). Cependant, vous devez utiliser la syntaxe officielle des propriétés en C#. Cela crée une expérience plus agréable en C# (par exemple avec IntelliSense).

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

15voto

Michael Perrenoud Points 37869

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

Enfin, si vous n'avez pas de travail à faire dans le cadre de la get o set alors 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 ce qui est nécessaire.

// more code == more bugs

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

public string A { get; private set; }

C'est beaucoup plus simple, n'est-ce pas ? Le site public Le modificateur est implicite sur les deux get et le set mais il est possible d'y déroger. Il s'agit bien entendu de la même règle pour tout modificateur utilisé lors de la définition de la propriété elle-même.

14voto

Felipe Oriani Points 11973

Avec cela, vous pouvez exécuter un certain code dans le get o set l'étendue.

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

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

public string myProperty
{
    get;
    set;
}

Et .Net Framework s'en chargera pour vous. Il a été créé parce que c'est une bonne pratique et qu'il est facile à faire.

Vous pouvez également contrôler la visibilité de ces scopes, 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é. Par exemple :

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

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

public int Property { get; } = 1;

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

public int Property => GetValue();

9voto

agrothe Points 1160

1er

string _myProperty { get; set; }

C'est ce qu'on appelle un Propriété automobile dans le monde .NET. C'est juste du sucre syntaxique pour le numéro 2.

2ème

string _myProperty;

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

C'est la façon habituelle de procéder, 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 modification de propriété. Si ce n'est pas le cas, utilisez simplement la propriété auto, c'est à peu près la norme.

3

string _myProperty;

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

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

Le site this Le mot-clé ici est redondant. Il n'est pas du tout nécessaire. Il s'agit simplement de méthodes qui obtiennent et définissent des éléments, par opposition aux propriétés, comme le font les méthodes Java.

3voto

OnABauer Points 609

Pour clarifier, dans votre troisième exemple, _myProperty n'est pas réellement une propriété. C'est un champ avec des 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 troisième méthode doit être évitée dans la plupart des situations. Vous ne l'utiliserez vraiment que si le type que vous voulez retourner est un tableau, ou si la méthode get fait beaucoup de travail au lieu de simplement retourner une valeur. Ce dernier cas n'est pas vraiment nécessaire, mais pour des raisons de clarté, une méthode get d'une propriété qui effectue beaucoup de travail est trompeuse.

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