3

class Foo私が持っていると 仮定します

class FooFrobber
{
   private Foo _foo;

   FooFrobber(Foo foo)
   {
       _foo = foo;
   }

   Frob()
   {
      _foo.FrobCount += 1;
   }
}

_fooはフィールドに適した名前のようですが、または変数privateにしたい場合はどうすればよいでしょうか? 慣例 ( http://weblogs.asp.net/lhunt/archive/2004/08/17/CSharpCodingStandardsv113.aspx経由のStyle guide for c#? ) は、m_ または末尾の _ のない StudlyCaps を使用するようです。宣言します。これは機能しているように見えますが、クラス名をシャドウイングするのは少し奇妙に思えます。スタイル ガイドには、すべてのフィールドを非公開にする必要があると書かれていますが、それは少し過剰に思えます (ただし、これは私の内なる python の話かもしれません)。いずれにせよ、_foo をプロパティにラップしたい場合は、同じ問題が発生するようです。internalprotectedprotected Foo Foo

MyFoo のように、常にフィールドに別の名前を付ける必要がありますか? コンパイラが気にしないように見えるので、これをそのままにしておいてもいいですか?

4

3 に答える 3

2

タイプと同じ名前を共有するフィールド/プロパティを持つことは許可されており、一般的な慣行です。FCL から頭に浮かぶ最初の例はDispatcherObject.Dispatcher、型のインスタンスを返すDispatcherです。

ただし、個人的には、フィールドを保護されていると宣言することは避け、代わりにプロパティを使用することを好みます。バッキング フィールドの宣言に伴うコーディングを避けたい場合は、自動実装プロパティを使用できます。

protected Foo Foo { get; set; }

プロパティを使用する利点は、getter と setter に異なるアクセス修飾子を適用できることです。

protected Foo Foo { get; private set; }

編集: 保護されたフィールドの代わりに保護されたプロパティを使用する利点は、アクセスする可能性のある外部ライブラリを壊すことなく、実装を変更できることです。たとえば、値の検証や変更通知を導入することができます。

たとえば、クラスを拡張して を実装するとしますINotifyPropertyChanged。保護されたフィールドを使用している場合、使用するアセンブリによってフィールドの値がいつ変更されたかを検出する簡単な方法はありません (外部アセンブリの実装も変更しない限り)。保護されたプロパティを使用していた場合は、使用するアセンブリを変更する必要なく、その実装を変更するだけで済みます。

private Foo foo;

protected Foo Foo 
{ 
    get
    {
        return foo;
    }
    set
    {
        if (foo != value)
        {
            foo = value;
            OnPropertyChanged("Foo");
        }
    }
}

編集2 : LBushkin's answerには、フィールドよりもプロパティを使用する利点がいくつかあります。

フィールドをプロパティに変更すると、ABI が壊れているように見えます。信頼できる情報源に記載されていることをまだ見つけていません(あまり時間をかけて調べていませんでした)。ただし、 pstのコメントごとに:

プロパティの背後にあるコードは変更できます (カスタムのプライベート バッキング フィールドなどを使用するため)。ただし、パブリック メンバー変数をプロパティに変更することは、ABI (アプリケーション バイナリ インターフェイス) の重大な変更です。

jstedfastの回答によると:

最初に覚えておくべきことは、プロパティ アクセサーはメソッドにコンパイルされるということです。これは、構文的には同じように見えても、クラス メンバー変数の読み取り/書き込みとは異なる ABI を持つことを意味します。

于 2012-06-05T18:39:07.093 に答える
1

主にC++世界から来て、フィールドの名前_を前に付けることは一般的な方法です。そのような命名変換は、開発グループの要件に適合するまではまったく問題ありません。

理想的な世界では、または (たとえば) 可能な限り変数の命名に従うべき方向はtypeその名前で変数の名前を強調表示しないことですが、それはこのプログラムでそれが表すことを意味します。

だから(言う)を持つ代わりに

string sName、持つstring userName、代わりにRobot robot、持つRobot conveyor、など...

お役に立てれば。

于 2012-06-05T18:45:18.107 に答える
0

このまま放置しても全然問題ないと思います。コンパイラは、コードがクラスまたはプロパティを参照しているかどうか、およびクラス名が十分に表現力がある場合に別の用語を導入する理由を判断できます。

于 2012-06-05T18:38:39.570 に答える