アクセサが空のプロパティとアクセサのないプロパティの違いは?
// Property with empty accessors
public string Name { get; set; }
// Property without accessor
public int Counter;
編集:
コンパイラのステートメントを超えた意味は、そのようなことを意味します
アクセサが空のプロパティとアクセサのないプロパティの違いは?
// Property with empty accessors
public string Name { get; set; }
// Property without accessor
public int Counter;
コンパイラのステートメントを超えた意味は、そのようなことを意味します
実際、2 つ目はプロパティではなく、パブリック フィールドです。
C# のプロパティは、アクセサーとミューテーター (または get と set) の 2 種類のメソッドの単なるショートカットです。したがって、次のようなプロパティを記述すると、
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
コンパイラは実際に 2 つのメソッドを作成します
public string get_Name() { return _name; }
public void set_Name(string value) { _name = value; }
あなたが書くとき
public string Name { get; set; }
次に、コンパイラはこれら 2 つのメソッドを生成し、バッキング ストレージ (フィールド_name
) を生成します。
get
andを使用しない場合set
、それは単純なフィールド ( など_name
) であり、コンパイラによってメソッドは生成されません。
2 番目の質問: C# のフィールドとプロパティの違いは何ですか
プロパティは実際にはメソッドであるため、抽象的または仮想的である可能性があり、オーバーライドされる可能性があります。プロパティはインターフェイスの一部である可能性があります。プロパティは、データ バインディングで使用できます。プロパティに任意のロジックを追加できます (イベントの発生、遅延読み込み、検証の実行など)。プロパティの設定と取得に異なるアクセス レベルを定義できます (プライベートとパブリックなど)。これはすべて public フィールドには当てはまりません。
最初の 1 つのコンパイラはプライベート フィールドを生成します。たとえば、次のようになります。
private string _name;
public string Name { get {return _name;} set { _name = value; } }
2 つ目は単なるパブリック フィールドです。
さらに、派生クラスのプロパティをオーバーライドできます (フィールドの場合はできません)。
SO への影響についての適切な説明があります: public フィールドはプロパティよりも速いのはなぜですか?
public string Name { get; set; }
この構文は自動プロパティを作成します。これは省略形で、次と同等です。
private string _name;
public string Name
{
get
{
return this._name;
}
set
{
this._name = value;
}
}
これは、次の構文とは異なります。
public string Name;
これにより、パブリック フィールドが作成されます。
違いは、フィールドがメモリのブロックである場合、プロパティは実際にはインスタンスの値を取得または設定するメソッドの省略形であるということです。この 2 つは同じ動作をしているように見えますが、微妙に異なります。
一般的に言えば、公開されているすべての値のプロパティを使用する必要があります。これは、独自の内部実装に関する抽象化であるためです。プロパティの内部 getter 実装を後でより複雑なものに変更したい場合、クラスのパブリック インターフェイスに変更はなく、その変更はクラスを使用するものからは見えません。
一般的に言えば、パブリック メンバーには常にプロパティを使用する必要があります。そうすることで実質的なコストは発生せず、オブジェクトの保守が容易になります。