0

C# 3.0 以降、プロパティからインスタンス変数を自動生成する新しい構文があります。

public string Foo { get; set; } 

ただし、基になるバッキング フィールドにアクセスする方法はありません。したがって、同じインスタンス変数を宣言すると、「ゲッター」と「セッター」を呼び出すオーバーヘッドなしで同じ効果が得られるため、その意味がわかりません。

public string Foo;

次のようにプロパティを宣言します。

public string Foo { get; } 

また

public string Foo { set; } 

resp を書くことができないため、まったく役に立ちません。フィールドの内容を読み取ります。

なぜ C# でこのシンタックス シュガーを導入するためにこれだけの努力をしたのかについて、誰かが良い説明を持っていますか?

編集:人々は私がフィールドとプロパティを混同していると思っているようですので、私が言ったことを明確にさせてください.

自動生成フィールドを持つプロパティを使用している場合:

public string Foo { get; set; } 

プロパティにアクセスするたびに「ゲッター」へのオーバーヘッド呼び出しがあり、get_Foo()「ゲッター」で特に何もしていないため、マッシュアップがないため、それには意味がありません。このプロパティを作成する興味。フィールドの作成はまったく同じで、はるかに高速です (最適化に関して)。

ありがとう

4

5 に答える 5

4

public string Foo { get; set; }プロパティを定義します。
public string Foo;フィールドを定義します。

それらは異なるものです。前者は、フィールドではなくプロパティが実際に必要な場合に非常に便利です。

アクセスに関しては、さまざまなアクセスレベルを定義できます。

public string Foo { get; private set; }

C#3.0以降のプロパティとフィールドの違いも参照してください。


あなたの編集に関して、あなたが言っていることは次の場合にのみ意味があります:

  1. プロパティアクセサーに実際のロジックが含まれることはないことを100%確信しています。
  2. フィールドがデータにバインドされることは決してないことを100%確信しています。

上記のいずれかが当てはまらない場合は、プロパティが空のスタブのように見えても、プロパティを定義する必要があります。
その後、アクセサにロジックを追加することを決定したときに、フィールドがフィールドであることに依存しているすべてのクライアントを壊すことはありません。
また、クラスがデータバインドされている可能性がある場合は、データバインディングメカニズムがフィールドを無視するため、すぐにプロパティが必要になります。

于 2012-07-25T13:50:01.260 に答える
3
public string Foo; 

フィールドです。

public string Foo { get; set; }

プロパティです。それらは、以前に議論されたものと同じで ありません。主に普及している利点の 1 つはアクセス制御です。これは例として非常に頻繁に使用されます。 get; private set;

ただし、基になるバッキング フィールドにアクセスする方法はありません。

はい、ゲッターを呼び出すことによってです。[this.]Propertynameローカルでアクセスしたい場合に使用します。


public string Foo { get; } 

public string Foo { set; } 

との両方を実装する必要があるため、コンパイラ エラーが発生しgetますset

于 2012-07-25T13:50:57.753 に答える
2

そのポイントは、コードをより簡潔にし、入力を少なくすることです。

あなたの例では:

public string Foo;

フィールドであり、プロパティと同じではありません:

public string Foo { get; set; }

したがって、自動プロパティ構文には用途があり、次のものと多少同等です。

private string _foo;
public string Foo { get { return _foo; } set { _foo = value; } }

ただし、適切な名前は作成されず、C# では無効になる安全な名前が使用されます (ただし、IL では有効です)。

プロパティのオーバーヘッドは、技術的には可能ですが、通常は JIT によって直接フィールド アクセスに解決されます。

プロパティは通常、ほとんどのデータ バインディング フレームワークのターゲットでもあります。リフレクションでは、プロパティはフィールドとは異なります。WPF / WinForms のデータ バインディングはプロパティを使用します (パブリック フィールドではありません)。ほとんどのプロパティは、バッキング フィールドを使用してデータを格納します。トレードオフは、クラス内では、バッキング フィールドを使用するのではなく、引き続きプロパティを使用することです。実際には、リリース用に最適化されたコードでは、JIT がそれらをまったく同じものに解決するため、パフォーマンスはまったく同じです。

于 2012-07-25T13:50:11.253 に答える
2

それ自体は無意味ですが、次のようなことができます。

public string Foo { private set; get; } 

どちらがより多くの価値があります。

また、プロパティとフィールドは同じものではありません。

于 2012-07-25T13:51:18.220 に答える
0

プロパティの定義が速くなり、コードがきれいになります。プロパティが必要ない場合は定義しないでください。ただし、フィールドは使用しないことをお勧めしpublicます。プロパティprivateを作成してアクセスしても、IL で定義されたフィールドを返すだけです。さらに、getorで何らかの作業を行う必要がある場合setは、それがフィールドであろうと継承されたメンバーであろうと、バッキング値を何らかの方法で定義する必要があります。

于 2012-07-25T13:52:13.470 に答える