2009-04-10 11 views
14

セッターの健全性チェックの値が他にあるのは、パブリック変数にプロパティーを優先させる根本的な理由がありますか?なぜパブリック変数にプロパティが優先されますか?

+0

効果的には、http://stackoverflow.com/questions/641619/when-should-you-use-a-field-rather-than-a-propertyとhttp://stackoverflow.com/questionsの二倍体/ 379041 /他のものの中では、最もよく使用される実践のための公的フィールド/ 379057 – tvanfosson

答えて

22

これまでにこの件がありましたが、今は何も見つかりません。

あなたのニーズは変わる可能性があります:現在、サニティチェックがない場合、将来的に必要になる可能性があります。ただし、パブリックフィールドをプロパティに変更すると、バイナリ互換性が損なわれます。コード/ライブラリを使用するすべてのクライアントは、再コンパイルする必要があります。

が悪いこれは潜在的に多額の費用がかかるためです。

最初からプロパティを使用すると、この問題は回避されます。これは、ライブラリの一部ではないコードの数もカウントします。どうして?あなたは決して知ることができないので、たとえドメイン特有のものであっても、コードはライブラリにリファクタリングしたいので便利です。公開/保護されたフィールドの代わりに既にプロパティを使用している場合、このリファクタリングプロセスは明らかに簡単になります。

あなたがちょうどあなたのコードのかなりの節約、自動実装プロパティを使用することができますので、また、パブリックプロパティを書くことがC#3.0で簡単です:

public DataType MyProperty { get; set; } 

は、必要なバッキングフィールドを実装し、ゲッター/セッターますあなたのためのコード。

私は個人的なメモを追加します。この点に関する.NETの動作はやや怠惰です。コンパイラは、パブリックフィールドをその場でプロパティに変更するだけで問題を回避することができます。 VB6は既にCOMで公開されているクラスのためにこれを行いました。私はVB.NETとC#が全く同じことをしない理由は絶対に見ません。おそらく、コンパイラチームの誰か(Jared?)がこれについてコメントすることができました。

+1

コンパイラがこれを行うことができない理由はたくさんあります。すぐに心に来る2つの理由があります。 1)名前と2)プロパティを呼び出すことは、フィールドにアクセスすること(パフォーマンス、参照と出力)と同じではありません。残念ながら、 – JaredPar

+2

(cont)を本当にコメントするには十分なスペースがありません。スレッドは閉じられています。しかし、短いバージョンは、ユーザーが1つのアイテムを要求しており、それらのアイテムに非等価の置換を与えているということです。あなたがそれをするとき、ユーザーはしばしば不幸です。 – JaredPar

+0

答えをありがとう、Jared。 :-) –

3

Jeff Atwood has blogged about it

些細な財産を作るために正当な理由が上に示されているとおりに、あります

  • 反射特性を対変数に異なる動作をするので、あなたは反射に依存している場合、それはですすべてのプロパティを使用しやすくなりました。
  • 変数に対してデータバインドすることはできません。
  • 変数をプロパティに変更すると、a breaking changeになります。

変数とプロパティの間にはあまり意味のない摩擦があります。ほとんどの場合、彼らはまったく同じことをします。変数とプロパティとの区別は、このような継続的な問題であれば、より根本的な解決が順番にある場合

public property int Name; 

しかし、私は疑問に思う:Kevin Denteは私たちに両方の長所を与える新しい構文のビットを提案しました。 プロパティに完全に賛成する変数を使用することはできませんか?プロパティは変数とまったく同じことをしませんが、可視性を細かく制御できますか?

0

プロパティを使用すると、コードがオブジェクト指向になります。メンバ変数をpublicにすると、実装が公開されます。

また、C#のプログラミングガイド

3

からこのlinkは将来のプロパティにフィールドの変更を参照破断変更と考えられています。フィールドはクラスの実装の詳細とみなされ、それらを公開するとカプセル化が公開されなくなります。

+0

呼び出し元コードを再コンパイルできない場合は、呼び出し元コードを所有していて、同じビルドシステムでコンパイルされている場合がほとんどです。したがって、これは.NETフレームワークチームのほとんどの側にとって問題ではありません。 –

+0

@Ian Ringrose:完全なソース互換性もありません。例えば、あなたのコードは 'ref obj.MyField'を行うかもしれません。ソースを変更することなく、 'MyField'を' MyProperty'に変更することはできません。 –

+0

@Ian:それは急変です - http://msdn.microsoft.com/en-us/library/ms182141(VS.80).aspx – Cerebrus

2

クローズド環境で作業する場合、SDKを開発しないと、すべてのクラスが同じプロジェクトフレームワーク内で使用されます。違いはありません。

通常の議論は、「将来的には値のチェックをする必要があるかもしれないので、プロパティでより簡単です」ということです。私はそれを全く買わない。

パブリックフィールドを使用すると読みやすく、装飾が少なくなり、使いやすくなります。

+0

"使いやすくなっていますか?" –

0

はい。

文字列を保持するパブリック変数を考えてみましょう。単純に設定できます。ただし、パブリック変数が文字列で初期化されるオブジェクトを保持する必要がある場合は、元のオブジェクトを使用してすべてのコードを変更する必要があります。しかし、setterを使用した場合は、setterを変更して、指定された文字列でオブジェクトを初期化するだけです。

1

また、書き込みアクセスを保護し、プロパティを持つ読み取りアクセスを許可することができます。一言で言えば

public int Version { get; private set; } 
+0

これは実際にはコンパイルされません。私はあなたが意味することは、と思います: 'public int Version {get;プライベートセット; } ' –

7

  • あなたがアクセスもを制御することができます(読み取り専用、
    書き込み専用、読み取り/書き込み)
  • プロパティを設定すると値を検証できます(nullなどを確認してください)
  • 遅延処理などの追加処理を行う
  • の実装を変更することができます。たとえば、 プロパティは、今すぐメンバー 変数によってサポートされていますが、 ユーザーコードを破棄することなく、 をDB行にバックアップするように変更することができます。
関連する問題