さて、私はプロパティを学んでいますが、次のことについて確信が持てません:
class X
{
private int y;
public X(int number)
{
this.Y=number; // assign to property
OR
this.y=number //?
}
public int Y;
{
get; set;
}
}
さて、私はプロパティを学んでいますが、次のことについて確信が持てません:
class X
{
private int y;
public X(int number)
{
this.Y=number; // assign to property
OR
this.y=number //?
}
public int Y;
{
get; set;
}
}
自動プロパティ(get; set;
またはそのバリアント)を使用する場合、バッキング変数にアクセスできません。これらは、ほとんどの場合、特に内部的には単純な変数として扱うことができます。
ミューテーターでカスタム検証またはミューテーションロジックを実行する必要がある場合、または明示的なバッキング変数が必要な場合は、自動プロパティを使用できませんが、スタブget
とset
メソッドを自分で作成する必要があります。
彼らは異なることをします。(未使用の)フィールドY = number;
を削除しますy
。自動的に実装されたプロパティで、コンパイラは独自のフィールド(C#では表示できない恐ろしい名前)を作成します。独自のフィールドを指定する必要はありません。それで:
class X
{
public X(int y)
{
Y = y;
}
public int Y { get; set; }
}
その他のポイント:発信者にとってより明確になるように変更さnumber
れました。また、あいまいではないため(フィールドとパラメーターなど)、y
必要ありません。this.
そのフィールドを表すプロパティ (public int Y {get;set}) 内のフィールド (private int y) にのみ割り当てます。 バッキング フィールドを直接割り当てる必要があるクラスの他の場所はありません。常にプロパティを介してそれを行います...はい、コンストラクターでも。これは、自分自身を繰り返さない ( DRY ) 原則に従います。
将来、その割り当てによってトリガーされる動作を関連付けたい場合はいつでも、コードを書き込む場所 (set アクセサー) が 1 つしかない ため、これをお勧めします。フィールドが割り当てられているすべての場所ではありません!!
class X
{
private int y; //not strictly necessary but good for documentation
public X(int number)
{
Y = number;
}
public int Y { get; set; }
}
次のような自動プロパティを使用する場合:
public int Y;
{
get; set;
}
自動生成されるため、プライベートプロパティは必要ありません。したがって、クラスは次のようになります。
class X
{
public X(int number)
{
Y = number;
}
public int Y // no semicolon here, comment added for edit length
{
get; set;
}
}
お役に立てれば
次の 2 つの選択肢があります。
class X
{
private int y;
public int Y
{
get { return y; }
set { y = value; }
}
public X(int number)
{
Y = number;
//equivalent to
y = number;
// but you should use the public property setter instead of the private field
}
}
または auto-properties を使用すると、さらに簡単になります。
class X
{
private int y;
public int Y
{
get; set;
}
public X(int number)
{
Y = number;
}
}
自動プロパティを使用しない場合は、常にプロパティ セッターを使用します。実行する必要があるコードがセッターに存在する可能性があるためです。このコードは、ドメイン チェックまたは PropertyChanged などのイベントの発生である可能性があります。
バッキング変数へのアクセスについて、私がいつも心がけている点は次のとおりです。
public getter には、複雑なデータ検証、プロパティ変更イベントの発生、または外部コードが値を変更したときにトリガーされるその他の複雑なコードが含まれる場合があります。
その値を内部的に (クラス内から) 変更する場合、パブリック セッターからのすべての検証とイベントをスキップすることが意図されている場合は、バッキング変数を直接使用することが有効なポイントになる可能性があります。「私はクラスのインスタンスです。私は自分が何をしているか知っています」と言っているようなものです。このように、パブリック セッターは番犬のように機能し、外部入力をサニタイズしますが、プロパティを必要なものに内部的に設定することもできます。
class X
{
private int y; //not strictly necessary but good for documentation
public X(int number)
{
y = GetYValueFromDB(); //we assume the value from DB is already valid
}
public int Y {
get{ return y};
set {
if (ComplexValidation(value)
{
RaiseOnYPropertyChanged();
y = value;
}
}
}