2012-01-07 2 views
7

可能性の重複:
Difference between Property and Field in C#C#フィールド

私は変更することができるという唯一の利点で、基本的な性質({ get; set; })ここで、公共分野と同じことを考えましたバイナリ互換性を損なうことなく私はここにhttps://stackoverflow.com/a/8735303/331785を得た答えに続いて、私はプロパティにも不利益があることを知った。それらが値型であれば、参照でアクセスすることはできません。これはなぜですか、そして他にどのような違いがありますか?

+0

ここに答えがあります:http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp –

+5

これは誤りです。プロパティは参照によって完全に停止することはできません。参照型と参照型を混同してしまうのは間違いです。 – Noldorin

+1

つまり、参照型の参照は、デフォルトでは値によって渡されます。参照渡しは、参照型と値型の両方に対して常に 'ref'または' out'キーワードで行われます。 – diggingforfire

答えて

14

プロパティにも不利な点があることがわかりました。それらが値型であれば、参照でアクセスすることはできません。なぜですか?

プロパティは単なる方法にすぎません。 ILを見ると、get_PropertyNameset_PropertyNameのようなメソッドが表示されます。その問題は、参照の操作をサポートするために、メソッドの参照を返す必要があります。

public ref T MyProperty 
{ 
    get 
    { 
     return ref _underlyingField; 
    } 
} 

これはもちろんsomething entirely possible in the CLRです。 C#言語では公開されません。

でも可能ですが、CLRは検証可能な状態にするためにいくつかの調整が必要です。プロパティの構文は、それをサポートする必要があります。

しかし、は、有用なもののどれですか??あなたが述べたように、フィールドはそれを行うことができます。あなたがそれを必要とするならば。フィールドを使用します。それをサポートするには多くの作業が必要です。おそらく、それが適切な場合はほとんどないでしょう。最初にフィールドを使ったほうが良いかもしれない多くのケースが生まれます。

4

プロパティは、getX()およびsetX()メソッドの糖衣構文です。見た目はフィールドのように見えますが、実際には2つの方法です。自動プロパティが追加された理由は、フィールドを作成してそのプロパティの標準getterとsetterを作成し、インタフェースを変更せずに実装を変更できるようにする必要があるという繰り返しを避けるためです。

値型の場合に参照でアクセスできないのは、値型が一般にスタック上にあり、メソッドを呼び出すだけなのでです。プロパティ内のゲッターをコールしなければならず、返される値は参照される前にスタックにプッシュされなければなりません。

+6

-1は、値の型の神話をスタック上に伝播させるためのものです(「一般的」でも)。プロパティ(またはフィールド)がクラスである場合、*はスタックにありません。 –

+0

@JonSkeet私は彼がゲッターの戻り値について話していると思います。最初はレジスタで終わり、次にスタック上にあるので、参照可能なアドレスが得られます。 – CodesInChaos

関連する問題