私は変更することができるという唯一の利点で、基本的な性質({ get; set; }
)ここで、公共分野と同じことを考えましたバイナリ互換性を損なうことなく私はここにhttps://stackoverflow.com/a/8735303/331785を得た答えに続いて、私はプロパティにも不利益があることを知った。それらが値型であれば、参照でアクセスすることはできません。これはなぜですか、そして他にどのような違いがありますか?
C#フィールド
答えて
プロパティにも不利な点があることがわかりました。それらが値型であれば、参照でアクセスすることはできません。なぜですか?
プロパティは単なる方法にすぎません。 ILを見ると、get_PropertyName
とset_PropertyName
のようなメソッドが表示されます。その問題は、参照の操作をサポートするために、メソッドの参照を返す必要があります。
public ref T MyProperty
{
get
{
return ref _underlyingField;
}
}
これはもちろんsomething entirely possible in the CLRです。 C#言語では公開されません。
でも可能ですが、CLRは検証可能な状態にするためにいくつかの調整が必要です。プロパティの構文は、それをサポートする必要があります。
しかし、は、有用なもののどれですか??あなたが述べたように、フィールドはそれを行うことができます。あなたがそれを必要とするならば。フィールドを使用します。それをサポートするには多くの作業が必要です。おそらく、それが適切な場合はほとんどないでしょう。最初にフィールドを使ったほうが良いかもしれない多くのケースが生まれます。
プロパティは、getX()
およびsetX()
メソッドの糖衣構文です。見た目はフィールドのように見えますが、実際には2つの方法です。自動プロパティが追加された理由は、フィールドを作成してそのプロパティの標準getterとsetterを作成し、インタフェースを変更せずに実装を変更できるようにする必要があるという繰り返しを避けるためです。
値型の場合に参照でアクセスできないのは、値型が一般にスタック上にあり、メソッドを呼び出すだけなのでです。プロパティ内のゲッターをコールしなければならず、返される値は参照される前にスタックにプッシュされなければなりません。
-1は、値の型の神話をスタック上に伝播させるためのものです(「一般的」でも)。プロパティ(またはフィールド)がクラスである場合、*はスタックにありません。 –
@JonSkeet私は彼がゲッターの戻り値について話していると思います。最初はレジスタで終わり、次にスタック上にあるので、参照可能なアドレスが得られます。 – CodesInChaos
- 1. Cフィールドが
- 2. C#のフィールドとプロパティ
- 3. JSONを選択子フィールドC#
- 4. C#フィールドとしてのビットマップクラス?
- 5. C#GridViewのDateTime更新フィールド
- 6. C#odbcDatareader GET重複フィールド値
- 7. Selenium C# - フィールドのキャプチャ値
- 8. センターテキストと入力フィールド? asp.net C#
- 9. ユニットテストの必須フィールドc#
- 10. 空フィールドの確認Selenium C#
- 11. フィールドからのC#fieldinfo?
- 12. C#配列の静的フィールド
- 13. .NET、C#、Reflection:フィールド自体にフィールドがあるフィールドを一覧表示する
- 14. Objective-C静的フィールドの問題
- 15. C# - フィールドに乱数を生成する
- 16. mongodb C#ドライバの更新複数のフィールド
- 17. フィールドを知らずにC++オブジェクトをシリアライズ
- 18. asp.net、c#.net読み取り専用フィールド
- 19. C#で空白のフィールドを追加Interop
- 20. フィールドを比較する(validation c#/ asp.net)
- 21. イーサネットフレーム内のフィールドのプリミティブCタイプ
- 22. C#のXMLエディタ - 現在のフィールド表示
- 23. C#クラスのフィールド名(ドット付き)
- 24. C#の日付フィールドの更新
- 25. sizeof c構造体のcharフィールドのみ
- 26. C#アクセスするフィールドの構文
- 27. 多型問題 - 仮想フィールド? (C#)
- 28. データセット内のフィールドを検索するC#
- 29. C構造体、ポインタおよびフィールド
- 30. C++のビット配列のフィールドの操作
ここに答えがあります:http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp –
これは誤りです。プロパティは参照によって完全に停止することはできません。参照型と参照型を混同してしまうのは間違いです。 – Noldorin
つまり、参照型の参照は、デフォルトでは値によって渡されます。参照渡しは、参照型と値型の両方に対して常に 'ref'または' out'キーワードで行われます。 – diggingforfire