次のコードを検討してください。
private string _text = null;
private string[] _values = null;
public string Text { get { return _text; } }
public string[] Values { get { return _values; } }
これは、一般のメンバーだけでは達成できないことを何を達成しますか?
次のコードを検討してください。
private string _text = null;
private string[] _values = null;
public string Text { get { return _text; } }
public string[] Values { get { return _values; } }
これは、一般のメンバーだけでは達成できないことを何を達成しますか?
パブリック フィールドの代わりにプロパティを使用することで、実装を非表示にします。
ある時点で Text および Values プロパティが返すものを変更する必要がある場合、クラスの API を変更せずに動作を変更できます。
さらに、このイディオムは、公開されたデータへの外部アクセスを読み取り専用に制限します。
値を読み取り専用にすることですが、次のように書きたいと思います。
public string Text { get; private set;}
public string[] Values { get; private set; }
このコードは、外部エンティティが値を読み取ることを許可しますが、コードは内部的にバッキング フィールドを変更できます。
自動プロパティを使用して、それを簡略化できます。
public string Text { get; private set; }
public string[] Values { get; private set; }
public フィールドを使用すると、外部変更からの保護と内部変更のサポートを同時に行うことができなくなります。
フィールドを書き込み可能として外部に公開したい場合でも、プロパティにカプセル化することをお勧めします.これを行う)。
言うまでもなく、ほとんどのデータ バインディング フレームワークはフィールドを認識せず、プロパティのみを認識します。
あなたの例では、プロパティを読み取り専用にしていますが、他の用途もあります。
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
。日付の境界を設定する場合は、プロパティの設定部分を確認できます。
_text
andは_values
、それらが定義されているクラス内でのみ設定できますが、それらの値はプロパティを介してアクセスできます。