7

次のコードを検討してください。

    private string _text = null;
    private string[] _values = null;

    public string Text { get { return _text; } }
    public string[] Values { get { return _values; } }

これは、一般のメンバーだけでは達成できないことを何を達成しますか?

4

5 に答える 5

10

パブリック フィールドの代わりにプロパティを使用することで、実装を非表示にします。

ある時点で Text および Values プロパティが返すものを変更する必要がある場合、クラスの API を変更せずに動作を変更できます。

さらに、このイディオムは、公開されたデータへの外部アクセスを読み取り専用に制限します。

于 2012-04-24T16:03:18.830 に答える
6

値を読み取り専用にすることですが、次のように書きたいと思います。

public string Text { get; private set;}
public string[] Values { get; private set; }
于 2012-04-24T16:03:28.533 に答える
5

このコードは、外部エンティティが値を読み取ることを許可しますが、コードは内部的にバッキング フィールドを変更できます。

自動プロパティを使用して、それを簡略化できます。

public string Text { get; private set; }
public string[] Values { get; private set; }

public フィールドを使用すると、外部変更からの保護と内部変更のサポートを同時に行うことができなくなります。

フィールドを書き込み可能として外部に公開したい場合でも、プロパティにカプセル化することをお勧めします.これを行う)。

言うまでもなく、ほとんどのデータ バインディング フレームワークはフィールドを認識せず、プロパティのみを認識します。

于 2012-04-24T16:03:11.767 に答える
2

あなたの例では、プロパティを読み取り専用にしていますが、他の用途もあります。

public string Text { get { return _text; } }

内部で何らかの操作を行い、return_textそれをプロパティに対して返しTextたい場合は、次のようなことができます。

public string Text { get { return _text.ToUpper(); } }

これはフィールドのカプセル化です

カプセル化は、オブジェクト指向プログラミングの最初の柱または原則と呼ばれることがあります。カプセル化の原則に従って、クラスまたは構造体は、クラスまたは構造体の外部でコードを作成するために、その各メンバーにどの程度アクセスできるかを指定できます。クラスまたはアセンブリの外部から使用することを意図していないメソッドと変数を非表示にして、コーディング エラーや悪意のあるエクスプロイトの可能性を制限できます。

次の例を検討してください。

// private field
    private DateTime date;


    // Public property exposes date field safely.
    public DateTime Date 
    {
        get 
        {
            return date;
        }
        set 
        {
            // Set some reasonable boundaries for likely birth dates.
            if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
            {
                date = value;
            }
            else
                throw new ArgumentOutOfRangeException();
        }

    }

この例では、dateプロパティを通じてパブリックに公開されるプライベート フィールドがありますDate。日付の境界を設定する場合は、プロパティの設定部分を確認できます。

于 2012-04-24T16:18:22.283 に答える
2

_textandは_values、それらが定義されているクラス内でのみ設定できますが、それらの値はプロパティを介してアクセスできます。

于 2012-04-24T16:03:23.297 に答える