web-dev-qa-db-fra.com

lecture seule vs propriété getter-only privée en C # 6

C # 6 ajouté initialiseurs auto-propriété et donc nous pouvons le faire

private List<LinearLayout> layouts1 { get; } = new List<LinearLayout>();

Est-ce mieux ou pire que

private readonly List<LinearLayout> layouts2 = new List<LinearLayout>();

(N.B. cela est lié à la question de 2011 . Propriétés NET - Utiliser un ensemble privé ou une propriété en lecture seule? , mais cela inclut un getter public aux côtés d'un setter privé. Ici, je n'ai qu'un getter privé.)

6
dumbledad

Si vous regardez ici , vous verrez que le code suivant:

class Example
{
   private List<LinearLayout> layouts1 { get; } = new List<LinearLayout>();
}

Est abaissé par le compilateur pour:

internal class Example
{
    private readonly List<LinearLayout> <layouts1>k__BackingField = new List<LinearLayout>();

    private List<LinearLayout> layouts1
    {
        get
        {
            return <layouts1>k__BackingField;
        }
    }
}

et la propriété est encore réduite à une méthode get_layouts1() .

En d'autres termes, les initialiseurs à propriété automatique sont du sucre syntaxique pur. Ils fournissent un moyen d'utiliser les propriétés automatiques, tout en permettant d'initialiser le champ de support.

Du point de vue de la mutabilité, il n'y a donc aucune différence entre eux. Les deux fournissent un accès en lecture seule à une liste qui est initialisée lorsqu'une instance de la classe est créée.

Il est possible que cela crée une légère surcharge de performances car la méthode doit être appelée pour obtenir la référence de liste, mais il est probable que le CLR JIT optimise la méthode et accède simplement au champ directement.

L'utilisation la plus évidente pour les propriétés privées est à des fins de chargement différé/d'exécution différée . Il existe d'autres utilisations, mais à titre indicatif, il s'agit souvent de "bruit" inutile. Je n'irais pas jusqu'à dire que l'utilisation d'une propriété privée est pire que l'utilisation d'un champ, mais je conseillerais d'utiliser un champ en lecture seule dans la plupart des cas.

9
David Arno

Dans ce cas, ils fonctionneraient presque de manière identique. Il y a une subtilité qui rendrait la propriété privée loin d'être idéale:

  • Le bytecode accède au List<LinearLayout> via une fonction getter. Cependant, dès que le bytecode est recompilé pour votre environnement (ce que C # a fait depuis longtemps), la fonction getter serait optimisée, donc ce n'est pas un vrai problème.

S'ils sont utilisés de manière identique, il n'y aura aucune différence pratique.

0
Berin Loritsch