web-dev-qa-db-ja.com

プライベートフィールドの命名規則

まず、この質問は以前に何度か尋ねられたことがあり、最終的には個人的な好みの問題であることがわかっていますが、この主題に関するすべてのスレッドを読んで、いくつかのことが私にはわかりません。

基本的に、ほとんどの人が少なくとも同意するのは、パブリックメンバーはPascalCasedであり、プライベートメンバーはlowerCamelCasedである必要があるということです。

通常、議論を引き起こすのは、プライベートメンバーの前にアンダースコアを付けるかどうかなどです。プレフィックスはいくつかのStyleCopルールに違反しています(ただし、明らかにオフにすることができます)

接頭辞を付けない理由は、これを使用する必要があるということです。代わりにプレフィックスを付けます。

私が抱えている問題は、それがどのように違いを生んでいるのか理解できないということです。つまり、クラス内のパブリックメンバーでこれを使用できないわけではありません。

次のようなクラスの顧客を想像してみましょう。

class Customer
{
    private int age;

    public int Age
    {
        get { return this.age; }
        set { this.age = value; }
    }
}

(明らかに、このような単純なケースでは、自動プロパティを使用できますが、これは単なる例です)。

このクラス内に2番目のプロパティを追加した場合、this.age(プライベートフィールド)ではなくthis.Age(パブリックプロパティ)を使用して参照することを妨げるものは何もありません。ゲッターレベルで何らかの検証またはフォーマットが適用された場合、それが望ましい場合もあります。

また、クラスの他のプロパティで顧客の年齢を変更する必要がある場合は、セッターがビジネスルールの検証を実装できるため、バッキングフィールドではなくプロパティを直接使用するのが理にかなっています。

言い換えると、thisキーワードは両方で使用でき、IntelliSenseは両方を表示するため、このキーワードがプライベートバッキングメンバーとパブリックプロパティの間の混乱をどのように回避するのか本当にわかりません。

ありがとう。

26

たしかにそれは正しいね。そうではありません。

thisを使用すると、名前が競合する場合(たとえば、フィールド名と同じパラメーター名)に、クラスメンバーを使用していることを確認できます。

私にとって、パスカルケースのパブリックメンバーとキャメルケースのプライベートメンバーは、常にうまく機能するための十分な慣習でした。

14
Oded

MSの規則に従わない場合でも、プライベートフィールドの先頭の「_」規則を強くお勧めします。

  1. キャメルケースのパラメータ名との競合を排除します-「this」を使用する必要はありません

  2. これは、オブジェクトの内部永続状態が読み取られていること、または(さらに重要なことに)書き込まれていることを視覚的に示します。これは「これは私がたまたま見ている特定の方法の外に副作用がある」というフラグです。これは、なじみのないコードを見るときに知っておくことが非常に重要です。

54
Tom Bushell

this.ageを使用すると、Ageプロパティのバッキングストアとオブジェクトのメソッドのageパラメータを区別するのに役立ちます。

public bool CheckIfOlderThan(int age)
{
   // in here, just using "age" isn't clear - is it the method parameter? 
   // The internal field?? Using this.age make that clear!
   return (this.age >= age); 
}

もちろん、この場合、衝突を避けるために、パラメータにわかりにくい名前を付けることもできます。

ただし、プロパティの実際の定義(値を読み取ってバッキングストアに格納する)では、this.を追加しても実際には何も追加されません。私が知っている人の中には、必要なときだけでなく、常にthis.プレフィックスを使用することを好む人もいます。個人的な好みです...

8
marc_s

プライベートフィールドの前にアンダースコアを付けることは、基本的に「this」を使用することと同じです。ただし、アンダースコアは使用が速く、短く、エレガントです(これは、Javaと思います)から来ています)。

関数パラメーターとプライベートフィールドに同じ名前を付けることは、私には少し注意が必要です。 「this」の使用を忘れたことが一度だけではなく、厄介なNullPointerExceptionが発生しました(はい、Javaいつか... :))。

私の知る限り、ハンガリアン記法ではないため、FxCop規則に違反していません。

7
dzendras