公共の読み取り/書き込みアクセスを持つプロパティの主なアイデアは単純になることです。それはこのように、数の上にバッキングフィールドを追加しますNumber=10
によって再帰的に10に番号を設定しようとしますミューテータとアクセッサを含んでいます。
これらのget/setメソッドの内部に条件付きロジックがあると、クラスのコンシューマとの「契約」が壊れています....私は
var number = anInstance.Number;
アクセサ/ゲッターを呼び出すとき...私はanInstanceオブジェクトの数ではなく、それのいくつかのロジック駆動型誘導体の現在の状態を受け取ることを期待しています。同様にミューテーター/セッター
anInstance.Number = 123;
のための...私はそれが自動的にanInstanceオブジェクトの数の内部状態を設定することを期待します。
私は1つのステートメントでNumber
を設定した場合...
anInstance.Number = 123; // I expect anInstance to have an internal state of 123 for it's Number
var x = anInstance.Number; // I expect 123 back, not 10
...私はその次の行にその値を取得する場合、私は戻って同じ値を期待していますが、あなたの現在の実装と(もしそれも再帰的ではありませんでした)、Numberを123に設定すると、これは無視され、10の値は新しい内部状態として保存され、その後Number
を取得すると10の値が返されます。
Number
プロパティは、呼び出し元が要求したものを変更することが重要ではありません。 sの値。 Number
プロパティの起動者は、その指示に従う必要があり、起動者は機能するためには、奇妙な内部ゲッター設定ロジックについて知っている必要はありません。
実際に条件付きで物事を取得/設定する必要がある場合、条件付きロジックの場所はNumber
プロパティを含むクラスの外にあります。つまり、Numberプロパティを単純な自動実装ゲッターセッターで置き換え、次のようにします。
int x = anInstance.Number > 10 ? 10 : anInstance.Number; // replaced getter logic outside the class containing the `Number` property
anInstance.Number = x > 10 ? 10 : x; // replaced setter logic
再帰シンボルが表示される理由は、コードが再帰的に自身を呼び出すためです。 Number
プロパティは、いくつかのバッキングフィールドではなく、それ自身を呼び出しています。あなたはこの単純な方法であなたの財産を使用するときにプライベートバッキングフィールドを持つ必要がないこと、しかし、...プロパティはようになり
private int number;
public int Number
{
get
{
return number; // note the lower-case 'n' refers to the private field instead of the property
}
set
{
number = value;
}
}
注意を変更します。完全な読み書きアクセスを行うことを意図している場合は、単純にパブリックフィールドを使用できます。
public int Number;
ただし、プロパティを使用すると、フィールドへのアクセスを制御できます。
public int Number { get; private set; }
単純なパブリックプロパティでは許可されていませんが、readonly修飾子を使用してこの動作を行うことはできます。
public readonly int Number;
しかし、フィールドを使用して、上のプロパティを使用することの別の利点は、例がでMSDN
class TimePeriod
{
private double seconds;
public double Hours
{
get { return seconds/3600; }
set { seconds = value * 3600; }
}
}
から取得され、それが格納されている/使用方法の内部状態をより詳細に制御を提供できることegthisありますこの例では、このクラスのHoursプロパティの呼び出し元が時間の値を取得して設定していますが、フードの下では、クラスの内部状態は秒を使用して格納/取得しています。これは公共の場では不可能です。
https://www.google.fr/?gws_rd=ssl#q=What+is+the+problem+with+using+public+fields – Joe
ここで問題は何ですか?何も表示されません、例外がスローされるか、期待どおりに機能しません。 – Gusman
[documentation](https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx)と[チュートリアル](https://msdn.microsoft.com/en-us/library)を見てきましたか。 /aa288470(v=vs.71).aspx)? – clcto