2017-09-27 5 views
-1

Dans le contexte des meilleures pratiques et des performances (le cas échéant), quoi de mieux pour exposer une valeur qui est définie ou calculée une fois comme une propriété dans les propriétés de style C# 6+?Différence entre => constante à {get; } = constante en C#

Je compare expression bodied properties

public string Name => "bob"; 

et auto-property initialisation

public string Name { get; } = "bob"; 

-t-il desugar à la même chose? Je ne trouve nulle part dans les documents qui dit quoi utiliser pour mon cas. Je m'excuse si cela est déjà couvert dans SO, la recherche ne m'a pas où.

+0

Malheureusement, la réponse du duplicata ne répond pas aux spécificités d'un ensemble-une seule fois la valeur, la réponse ci-dessous répond à ma question exactement. – Jay

Répondre

5

Attention! les expressions bodied properties exécuteront l'expression chaque fois qu'elles sont appelées! Vous pouvez voir les exemples dans la dernière partie de ma réponse.

public string Name => "bob"; 

est le sucre syntaxique pour

public string Name 
{ 
    get 
    { 
     return "bob"; 
    } 
} 

Alors que

public string Name { get; } = "bob"; 

est le sucre syntaxique pour

private readonly string _name = "bob"; 

public string Name 
{ 
    get 
    { 
     return _name ; 
    } 
} 

Check it out yourself.

Attention, voici la partie dangereuse!

Veuillez noter que le corps d'expression sera exécuté chaque fois que vous appelez cette propriété. C'est bien quand il est de retour d'une valeur codée en dur, mais si elle est de retour une liste, par exemple, il retourne une nouvelle liste à chaque fois:

public List<String> Names => new List<String>() {"bob"}; 

est le sucre syntaxique pour:

public List<string> Names 
{ 
    get 
    { 
     return new List<string>() {"bob"}; 
    } 
} 

C'est pas le cas avec l'initialisation auto-propriété:

public List<String> Names { get; } = new List<String>() {"bob"}; 

est le sucre syntaxique pour cela:

private readonly List<string> _names = new List<string>() {"bob"}; 

public string Names 
{ 
    get 
    { 
     return _names; 
    } 
} 

Comme vous pouvez le voir, ici la liste n'est initialisée qu'une seule fois.

Check it out yourself.

+0

bien mis, merci. la subtilité était '{get;} =' définit le champ de sauvegarde :) – Jay

+0

Content de vous aider :-) –

3

Le premier est une flèche à fonctions et les résultats en une fonction qui retourne une valeur constante:

// syntactic sugar for: 
public string Name { get { return "bob"; } } 

// results into: 
public string get_Name() 
{ 
    return "bob"; 
} 

Le second est un auto-propriété, ce qui résulte en un getter avec champ de stockage avec la valeur " bob ":

// results into: 
private string _name = "bob"; 
public string get_Name() 
{ 
    return _name; 
}