2017-09-27 11 views
-1

ベストプラクティスとパフォーマンス(ある場合)のコンテキストでは、C#6 +スタイルのプロパティでプロパティとして一度設定または計算された値を公開する方が良いでしょうか?=>定数と{get; } = Cの定数#

私はそれは同じことにdesugarんexpression bodied properties

public string Name => "bob"; 

auto-property initialisation

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

を比較していますか?私はどこに私の場合に使用するかを言うドキュメントを見つけることができません。これが既にカバーされている場合は謝罪します。

+0

悲しいことに、重複の答えはセットワンス値のみの仕様に答えていない、以下の答えは私の正確質問に答えます。 – Jay

答えて

5

注意!式本体のプロパティは呼び出されるたびに式を実行します。私の答えの最後の部分で例を見ることができます。

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

private readonly string _name = "bob"; 

public string Name 
{ 
    get 
    { 
     return _name ; 
    } 
} 

Check it out yourself.

ための構文糖ですが

public string Name => "bob"; 

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

ためのシンタックスシュガーです0

ここに危険な部分があります!

式の本文は、このプロパティを呼び出すたびに実行されます。それは、ハードコーディングされた値を返すだ場合には罰金だが、それは、例えば、リストを返すなら、それは毎回新しいリストを返します。つまり

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

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

はのためにシンタックスシュガーです自動プロパティの初期化とない場合:

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

は、このための糖衣構文です:

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

public string Names 
{ 
    get 
    { 
     return _names; 
    } 
} 

ご覧のとおり、このリストは一度だけ初期化されます。

Check it out yourself.

+0

よく置いてありがとうございます。微妙なことが '{get;} ='バッキングフィールドを設定しています:) – Jay

+0

喜んで助けてください:-) –

3

最初のものは、一定の値を返す関数に矢印関数および結果である:

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

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

第一方が "値とバッキングフィールドにゲッターにもたらす自動性、です「ボブ」:

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