web-dev-qa-db-ja.com

C#でのプロパティvsフィールドvs関数の正しい使用法

私が書いたこのコード行に悩まされ、代わりに何を書くべきかについて少し混乱しました。

class SomeClass
{
    IBeneficiary _latestBeneficiary => new Beneficiary(Iban, Name);
}

コンテキストでは、フィールドは、これから作成される受益者オブジェクトの最新バージョンを表します。私は、これらのパブリックプロパティ内にあるものを考慮して、この変数が最新の可能なバージョンを表すようにします。

ここに私の仮定と思考プロセスがあります。そこに何か問題があると思います。そうでなければ問題はないでしょう。

したがって、明らかに、これはフィールドです。これはフィールドです。これは、クラス内に保持しているプラ​​イベート変数であり、それを認識するために、アンダースコアをプレフィックスとして追加します。

そのフィールドは、IbanとName(ここでは関係ありません)を考慮して、常に最新のIBeneficiaryを返します。これらのプロパティはパブリックであり、クラスで定義されたクラシックMyProperty SomeProperty { get; set; }です。

プロパティゲッター、=>を使用してフィールドを定義しました。常に新しいものを返すことはフィールドの予想される動作ではないため、これは混乱を招きます。またはそれは?

私はこれが関数のようなものであるように感じます

IBeneficiary CreateLatestBeneficiary (MyProperty param1, MyOtherProperty param2)
{ 
      return new Beneficiary(param1, param2);
} 

またはGetLatestBeneficiaryという名前を付けますが、どちらの場合も、これは本当に単純なゲッターのように見え、感じられるので、次のように、これを行う単一のゲッターを持つプロパティが必要です。正しい?

IBeneficiary LatestBeneficiary
{
   get
   {
       return new Beneficiary(Iban, Name);
   }
}

しかし、私有財産はほとんど分野です。だよね?

そのことを念頭に置いて、フィールドを使用して正方形に戻ります。

どこかで、私の発言の1つが間違っているように感じます。

私有地は大丈夫ですか?それとも、プロパティは、少なくともゲッ​​ターを備えたパブリックなものですか?または、フィールドが単純な古い変数でなくても問題ありませんか?

最終的に、自分でこのコード行をどのように記述しますか?

3
Gil Sand

したがって、明らかに、これはフィールドです。これはフィールドです。これは、クラス内に保持しているプラ​​イベート変数であり、それを認識するために、アンダースコアをプレフィックスとして追加します。

これは正しくありません。フィールドではありません。プロパティです。そして、そのプロパティは、コンパイラーが作成するメソッドの構文糖衣です。この場合、そのメソッドはIBeneficiary get__latestBeneficiary() => ...になります。

プライベートだからといってフィールドにしない。フィールドはメソッドではなく変数です。

または、GetLatestBeneficiaryという名前を付けますが、どちらの場合も、これは本当に単純なゲッターのように見え、感じられるので、次のように、これを行う単一のゲッターを持つプロパティが必要です。正しい?

コード:

IBeneficiary LatestBeneficiary
{
   get
   {
       return new Beneficiary(Iban, Name);
   }
}

意味的には次のものと同じです:

IBeneficiary _latestBeneficiary => new Beneficiary(Iban, Name);

2番目のバージョンの式本体の構文は、そのゲッターを表現するためのよりコンパクトな方法です。

私はこれが関数であるべきだと感じています

私は同意する傾向があります。これはプライベートな読み取り専用プロパティですが、読み取り専用プロパティ(つまり、getter)のままです。彼らは期待する荷物を運びます:ほとんどの開発者は、読み取り専用プロパティが毎回同じ値を返すことを期待します(特に、オブジェクトの残りの状態が変更されていない場合)。したがって、驚きを最小限にするという原則に従って、この方法でプロパティを使用することは避けてください。

だからそれをメソッドにしてください:

IBeneficiary CreateLatestBeneficiary() => new Beneficiary(Iban, Name);
7
David Arno
常に新しいものを返すことはフィールドの予想される動作ではないため、これは混乱を招きます。またはそれは?

はい、それはかなり混乱しています。関数が呼び出される前に、ゲッターが最後に作成された(「最新の」)受益者を返すことを期待します-私はnotすぐに作成して、新しい受益者を返すことを期待しています。

私はあなたの関数CreateLatestBeneficiaryが名前からわかるように最良の方法だと思いますvery新しいものであることを明確にします関数呼び出しの結果として存在します。おそらく名前をGenerateNewBeneficiaryに変更しますが、それは何よりも個人的な好みです。