web-dev-qa-db-ja.com

C#ゲッター、セッター宣言

重複の可能性:
なぜゲッターとセッターを使用するのですか?
C#3.0自動プロパティ-便利かどうか?

次の方法でプロパティを定義することに違いはありますか?

// private, with getter & setter
private string fName;
public string Name
{
    get { return this.fName }
    set { this.fName = value }
}

// define as a Property
public string Name { get; set;}

私の知る限り、それは文体の好みのように見えるだけです。私は何かが足りないのですか?

15
kosh

違い:

  • 2番目の形式は、C#3コンパイラ以降でのみコンパイルされます
  • 2番目の形式では、実際のフィールドには「言いようのない名前」があるため、コードが(同じクラスであっても)フィールドに直接アクセスすることはできません。

2番目のバージョンは、自動的に実装されたプロパティ(または略して「自動プロパティ」)として知られているものです。これらはC#3で導入されました。最初のバージョンのように見えるコードのみを記述している場合(つまり、ロジックが含まれていない場合)、自動プロパティは優れています。ロジックを最初の形式に変換することで、後でいつでもロジックを追加できます。すべてのコードは、ソースとバイナリの両方の互換性の観点から、その変更と互換性があります。

自動プロパティしないではデフォルト値を指定でき、真に読み取り専用の自動プロパティ(つまり、ゲッターのないプロパティ)などは存在しないことに注意してください。あなたが来ることができる最も近いものは、プライベートセッターを備えたパブリックゲッターです。

public string Name { get; private set; }

まったく同じではありませんが、多くの状況で十分に近いです。

26
Jon Skeet

1つ目は標準プロパティです。値を格納するフィールドを定義する必要があります。2番目は 自動実装プロパティ で、C#3.0以降でのみ使用できます。

2
George Johnston

最終的には、この場合も同じように機能します。違いは、取得/設定にルールを適用する場合に発生します。その場合、プライベート/保護された変数を使用して、パブリックプロパティの背後に隠す必要があります。

0
Kendrick

いいえ。実際、短いバージョンを使用する場合(public string Name { get; set; })コンパイラは、プロパティのプライベートフィールドを自動的に生成します。

0

答えはILにあります。 ildasmを使用して比較します。

http://msdn.Microsoft.com/en-us/library/f7dy01k1%28v=VS.90%29.aspx

0
Kris Krause