Visual Studio 2017にプロパティを生成させると、次のように、常に新しい式のボディプロパティが使用されます。
private static string username;
internal static string Username { get => username; set => username = value; }
このスタイルを次のものよりも使用する利点はありますか、それとも単に好みと読みやすさの問題ですか?
internal static string Username { get; set; }
式に基づいた構文は、次の場合に使用すると便利です。
プロパティのみを取得または設定
public DateTime Date => DateTime.Now;
方法
public IEnumerable<string> GetData => SomeMethodThatReturnData.Select(x => x.Name);
そして、1つの入力パラメーターを持つコンストラクター
public SomeClass(IRepository repository) => _repository = repository;
はい、違いがあります。実際には大きなものです。プロパティgetterおよびsetterはそれ自体を参照しているため、以前のソリューションでは無限ループが作成されます。
string Username { get => Username; set => Username = value; }
これは厳密に同等であり、次の構文とまったく同じです(単なる構文糖であるため)。
string Username
{
get
{
return Username;
}
set
{
Username = value;
}
}
したがって、プロパティUsername
のゲッターとセッターは両方とも、それ自体であるメンバーUsername
を参照します。そのため、メンバーにアクセスすると、メンバーは永久に繰り返し呼び出され、結果が返されることはありません。
あなたはおそらく次のことをするつもりでした:
string _username;
string Username { get => _username; set => _username = value; }
これで、プロパティの値を実際に保存するために参照するバッキングフィールドができました。これはうまく機能し、より詳細なgetterおよびsetter構文に違いはありません。同じものにコンパイルされます。 C#6を使用すると、ここで少し簡単にすることができます。
残りの違いは、明示的なバッキングフィールドと、自動プロパティの使用時に自動的に作成されるバッキングフィールドです。 autoプロパティを使用するかどうかはスタイルによって多少異なりますが、一般的に、使用しない本当の理由はありませんifそれ以外の場合は手動で同じバッキングフィールドを作成します。もちろん、値を単純なバッキングフィールドに格納していない場合や追加のロジックが必要な場合は、ここで自動プロパティを使用することはできません。しかし、それでもおそらく、表現力のあるプロパティにはならないでしょう。自動プロパティの この質問 も参照してください。
2番目のスタイルですぐにわかるいくつかの利点:
最初のスタイルの1つの大きな問題を見逃しました。以下のpokeの回答をご覧ください。