26

まず、この質問が以前に何度か聞かれたことは知っていますが、最終的にはほとんどが個人的な好みの問題ですが、この件に関するすべてのスレッドを読むと、いくつかのことが明確ではありません.

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

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

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

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

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

class Customer
{
    private int age;

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

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

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

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

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

ありがとう。

4

4 に答える 4

59

MS の規則には従いませんが、プライベート フィールドの先頭の "_" 規則を強く好みます。

  1. これにより、キャメル ケースのパラメーター名との競合が解消されます。「this」を使用する必要はありません。

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

于 2012-07-12T21:48:30.547 に答える
16

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

使用thisは、名前の競合 (フィールド名と同じパラメーター名など) が発生した場合に、クラス メンバーを使用していることを確認する方法です。

私にとって、pascal ケーシングの public メンバーと camel ケーシングの private メンバーは、常にうまく機能するのに十分な規則でした。

于 2010-12-27T16:37:12.040 に答える
8

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

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.必要なときだけでなく、常にプレフィックスを使用することを好みます-個人的な好みです...

于 2010-12-27T16:38:10.583 に答える
7

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

関数のパラメーターとプライベート フィールドに同じ名前を付けるのは、少し難しいように思えます。「これ」を使用するのを忘れて、厄介な NullPointerException が発生したことは一度だけではありません (はい、いつか Java を実行しました... :) )。

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

于 2011-01-02T11:05:49.710 に答える