0

すべての調査で、ユーザーに内部プロパティへのアクセスを許可する場合は常に、プロパティへの直接アクセスを許可するのではなく、get/setメソッドを介してアクセスを許可する必要があることを学びました。

class myClass
{
    private int x;

    public void SetX (int x)
    {
        this.x = x;
    }

    public int GetX ()
    {
        return this.x
    }
}

これにより、プログラマーがユーザーに影響を与えることなくエンジンを完全に簡単に変更できるという追加の利点が得られるため、デバッグが容易になり、入力の有効性を確認するためのオプションが増えます。

ただし、C#で学習と書き込みを開始してから、言語に「ネイティブ」なクラスのほとんどが、たとえば、長方形(System.Drawing.Rectangle)の位置やサイズを設定/取得するためにプロパティを公開していることに気付きました。簡単にアクセスできます。X、、、およびプロパティをY直接。WidthHeight

  • プロパティを公開することの唯一の利点は、コードが少し単純になることです。プロパティを公開することには他に利点がありますか?

  • いつプロパティを公開する必要があり、いつ公開するべきではありませんか?

4

4 に答える 4

2

プロパティとフィールドを混同しています。C#では、プロパティはパブリックフィールドのように使用できますが、内部的にはそれらのget/setメソッドが呼び出されます。例として、プロパティを持つクラスは次のようになります。

class MyClass
{
    // Field, direct access to the internal representation
    private int x; 

    // Property, access via methods, but syntax like field access
    public int X {
        get { return this.x; } // generates a get-method "int get_X()"
        set { this.x = value; } // generates a set-method "void set_X(int value)"
    }
}

プロパティXを次のように設定するmyClass.X = 42と、コンパイラはこれをに変換し、ブロックmyClass.set_X(42)で宣言されたメソッドを呼び出します。setフィールドのような構文は、便宜上のものです。

したがって、set/get-methodsを公開することをお勧めするのは事実です。C#では、プロパティを使用するのが好ましい方法です。これにより、これらのメソッドの実際の呼び出しが抽象化され、フィールドのように使用できるようになります。

于 2013-03-25T08:02:06.120 に答える
1

つまり、基本的に、あなたの質問はプロパティとパブリック変数です。いつ何を使うの?

コメントを含め、この投稿を読んでください。

ディスカッション全体の簡単な要約:

  • リフレクションは変数とプロパティで動作が異なるため、リフレクションに依存する場合は、
    すべてのプロパティを使用する方が簡単です。
  • 変数に対してデータバインドすることはできません。
  • 変数をプロパティに変更することは、重大な変更です。

データメンバーを公開するという些細なプロパティの実装は、利益がないかほとんどないために多くのコードであり、合理的な理由のみが次のようになります。

  • 何らかの理由でconstとして宣言できないメンバー変数への読み取り専用アクセスを提供するため

  • 一部のサードパーティが使用することを目的としたコンポーネントを作成していて、それらのユーザーによる再構築を必要とせずにコンポーネントを交換する必要がある可能性がある場合(パブリックメンバー変数をプロパティに変更すると、インターフェイスが破損するため、再構築が必要です)。

また、2つの理由から、パブリックフィールドをプロパティでラップします。1つは、バイナリ互換性を損なうことなく後で変更できないことです。2つは、フィールドにバインドできないことです。

Reflection code against fields looks very different from reflection code against 
properties (FieldInfo vs. PropertyInfo for starters). So even if you can 
recompile against the new binary, if you use reflection on that field 
you're hosed.
于 2013-03-25T07:51:32.150 に答える
0

C#では、同じ機能を提供するため、getter/setterメソッドの代わりにプロパティを使用します。フィールド!=プロパティに注意してください。MSDN:プロパティを参照してください。

于 2013-03-24T14:41:33.143 に答える
0

あなたが言ったように、変数への直接アクセスを与えないことの利点は、クラスのユーザーに変更を加えることなく実装を変更できることです。そして、オブジェクト指向プログラミングの観点から、それは重要なことだと思います。

また、プロパティを使用すると、「get」または「set」の動作に影響を与えることができます。これは特定の状況で役立ちます。

于 2013-03-24T14:51:29.543 に答える