2009-08-01 6 views
16

C#3.0に自動実装されたプロパティ言語機能が存在する理由を理解できませんでした。あなたはC#3.0の自動プロパティとパブリックフィールドの違い

public string FirstName { get; set; } 
+0

誰もコードネームを使用していません。 –

+0

[C#3.0 +のプロパティとフィールドの違い]の複製が可能です。(http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0) – nawfal

+0

すべてここの答えは、これが言語設計上の欠陥であるという事実を指摘するように思えます。確かにここの問題は、コンパイラまたは実行時のレベルで解決できます。バイナリとソースの互換性を損なわなければならないのはなぜですか?なぜ最適化できるボイラープレートを追加しなければならないのですか? –

答えて

21

より

public string FirstName; 

を言うとき、彼らは結果のILコード(機械語)に別々に実装されているので、それを作っているどのような違い

。 Automaticプロパティはパブリックゲッターとセッターとして公開されていますが、パブリックフィールドは単一のフィールドです。

このように、自動プロパティを実装すると、後日、 getterまたはsetter(バリデータを追加するなど)を使用せずに、それを使用する従属クラスを再コンパイルまたはre =コーディングせずに...

+9

さらに、データバインディングにプロパティを使用できます。 –

0

最初はパブリックフィールド、2番目はパブリックプロパティです。

主な違いは、その使用方法です。たとえば、WPFはデータのみプロパティにバインドでき、フィールドにはバインドできません。

2

違いは、プロパティを読み取るコードでコンパイルされた他のアセンブリがプロパティに対してコンパイルされている点です。

ゲッターまたはセッターにコードを追加する必要がある場合は、そのコードにリンクされている他のすべてのアセンブリを強制的に再コンパイルする必要はありません。

フィールドではそうではありません。後でフィールドをプロパティに変更すると、そのコードを追加するために、自分とリンクされている他のアセンブリは、プロパティではなくフィールドを読み込むようにコンパイルされているため、正しく機能しなくなります。

また、データバインディングなどのフィールドではなく、プロパティを検索するためのコードが多数作成されています。

5

後でそれぞれをカスタム実装のプロパティに変更したい場合は、どうなるか考えてみましょう。それが自動的に実装されるプロパティの場合は、フィールドを追加して実装を変更するだけです。完全なソースとバイナリの互換性。

最初にフィールドを入力すると、ソースのバイナリ互換性が得られません。それを参照するすべてのものを再構築し、もはやコンパイルしないものを修正する必要があります。

さらに、properties have various benefits over fields。フィールドへの私の主な個人的な異議は、の実装のAPIでの決定を公開することです。

9

他の人が言ったことに加えて、パブリックフィールドを宣言するだけで、フィールドは読み書き可能です。 publicオートプロパティを宣言すると、プロパティはパブリックですが、get/setレベルでアクセシビリティを制御するための修飾子を追加できます。

あなたのクラスのユーザーは、FirstNameをパブリックプロパティとして認識します。しかし、彼/彼女はそれに書き込むことはできません。このため、使用の

2

:OOよる「ユダヤ」は

0

オート性質を支配することを
public string FirstName { get; private set; }
簡単なプロパティは、彼らは任意の正規プロパティのようなバッキングフィールドを使用し、コンパイラは、通常のプロパティを生成しますが、あなたはしないでくださいそのためのコードを書く必要があります。ここでは、コンパイラによって生成されたコードの非常に説明のサンプル(Reflectorのおかげで)です:製品がRTMになったら、マイクロソフトの外

[CompilerGenerated] 
private string <ContentType>k__BackingField; 

public string ContentType 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<ContentType>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<ContentType>k__BackingField = value; 
    } 
} 
関連する問題