142

I realize that it seems to be a duplicate of What is the difference between a Field and a Property in C#? but my question has a slight difference (from my point of view):

Once I know that

  • I will not use my class with "techniques that only works on properties" and
  • I will not use validation code in the getter/setter.

Is there any difference (except the style/future development ones), like some type of control in setting the property?

Is there any additional difference between:

public string MyString { get; set; }

and

public string myString;

(I am aware that, that the first version requires C# 3.0 or above and that the compiler does create the private fields.)

4

10 に答える 10

165

フィールドとプロパティは同じように見えますが、そうではありません。プロパティはメソッドであるため、プロパティでサポートされていないものや、プロパティでは発生する可能性があるがフィールドでは発生しないものがあります。

違いのリストは次のとおりです。

  • out/refフィールドは、引数への入力として使用できます。プロパティはできません。
  • 複数回呼び出された場合、フィールドは常に同じ結果をもたらします (複数のスレッドの問題を除外した場合)。のようなプロパティDateTime.Nowは、常にそれ自体と等しいとは限りません。
  • プロパティは例外をスローする場合がありますが、フィールドは決してスローしません。
  • プロパティには副作用があったり、実行に非常に時間がかかる場合があります。フィールドには副作用がなく、指定されたタイプに期待できる限り常に高速になります。
  • プロパティは、ゲッター/セッターのさまざまなアクセシビリティをサポートします - フィールドはサポートしません (ただし、フィールドは作成できますreadonly)
  • リフレクションを使用する場合、プロパティとフィールドは異なるものとして扱われるMemberTypesため、異なる場所に配置されます ( GetFieldsvsGetPropertiesなど)。
  • JIT コンパイラは、プロパティ アクセスをフィールド アクセスとは大きく異なる方法で処理する場合があります。ただし、コンパイルすると同一のネイティブ コードになる可能性がありますが、違いの範囲はそこにあります。
于 2009-03-17T11:15:57.007 に答える
119

カプセル化。

2番目のインスタンスでは、変数を定義しました。最初のインスタンスでは、変数の周囲にゲッター/セッターがあります。したがって、後日変数を検証することにした場合は、はるかに簡単になります。

さらに、Intellisenseでは表示が異なります:)

編集: OPの更新更新された質問-ここで他の提案を無視したい場合、他の理由はそれが単に良いオブジェクト指向デザインではないということです。そして、それを行う理由があまりない場合は、常にパブリック変数/フィールドよりもプロパティを選択してください。

于 2009-03-17T09:38:05.120 に答える
43

いくつかの迅速で明らかな違い

  1. プロパティにはアクセサキーワードを含めることができます。

    public string MyString { get; private set; }
    
  2. プロパティは子孫でオーバーライドできます。

    public virtual string MyString { get; protected set; }
    
于 2009-03-17T09:39:37.580 に答える
14

基本的な違いは、フィールドは指定されたタイプのデータが格納されるメモリ内の位置であるということです。プロパティは、指定されたタイプの値を取得または設定するために実行される1つまたは2つのコード単位を表します。これらのアクセサメソッドの使用は、フィールドのように動作するように見えるメンバーを使用することによって構文的に隠されています(割り当て操作のいずれかの側に表示される可能性があります)。

于 2009-03-17T09:46:46.580 に答える
8

最初の1つ:

public string MyString {get; set; }

プロパティです。2番目の(public string MyString)はフィールドを示します。

違いは、特定の手法(インスタンスのASP.NETデータバインディング)はプロパティでのみ機能し、フィールドでは機能しないことです。XMLシリアル化についても同じことが言えます。プロパティのみがシリアル化され、フィールドはシリアル化されません。

于 2009-03-17T09:38:41.810 に答える
2

多くの場合、プロパティとフィールドは似ているように見えますが、そうではありません。フィールドに存在しないプロパティには制限があり、その逆もあります。

他の人が述べたように。アクセサーを非公開にすることで、プロパティを読み取り専用または書き込み専用にすることができます。フィールドでそれを行うことはできません。プロパティは仮想にすることもできますが、フィールドはできません。

プロパティは、getXXX()/setXXX() 関数のシンタックス シュガーと考えてください。これは、それらが舞台裏で実装される方法です。

于 2009-03-17T10:09:53.140 に答える
0

パブリック フィールドには常にフィールドではなくプロパティを使用する必要があります。これにより、既存のコードを壊すことなく、将来必要になった場合にライブラリが任意のフィールドのカプセル化を実装できるようになります。フィールドを既存のライブラリのプロパティに置き換えると、すべてのライブラリを使用する依存モジュールも再構築する必要があります。

于 2014-08-09T15:32:33.153 に答える