web-dev-qa-db-ja.com

表現型のプロパティと{get;セットする;}

Visual Studio 2017にプロパティを生成させると、次のように、常に新しい式のボディプロパティが使用されます。

private static string username;
internal static string Username { get => username; set => username = value; }

このスタイルを次のものよりも使用する利点はありますか、それとも単に好みと読みやすさの問題ですか?

internal static string Username { get; set; }
10
Max

式に基づいた構文は、次の場合に使用すると便利です。

プロパティのみを取得または設定

public DateTime Date => DateTime.Now;

方法

public IEnumerable<string> GetData => SomeMethodThatReturnData.Select(x => x.Name);

そして、1つの入力パラメーターを持つコンストラクター

public SomeClass(IRepository repository) => _repository = repository;
6
Sergey

はい、違いがあります。実際には大きなものです。プロパティ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それ以外の場合は手動で同じバッキングフィールドを作成します。もちろん、値を単純なバッキングフィールドに格納していない場合や追加のロジックが必要な場合は、ここで自動プロパティを使用することはできません。しかし、それでもおそらく、表現力のあるプロパティにはならないでしょう。自動プロパティの この質問 も参照してください。

3
poke

2番目のスタイルですぐにわかるいくつかの利点:

  1. 少ない入力。
  2. すぐに読むことができます。
  3. ゲッターまたはセッターが何か特別なことをしていると読者に思わせないでください。
  4. すべての参照を検索は、より少ない結果を返します。
  5. 式エバリュエーターは、コンパイラーによってトリガーされません。

編集

最初のスタイルの1つの大きな問題を見逃しました。以下のpokeの回答をご覧ください。

2
dotNET