2011-01-19 21 views
10

私の質問は以下のとおりです。、参照型対値型の使用は

  • をすると、我々は値型と参照型を使用する必要がありますか?
  • 他のものの長所と短所は何ですか?
  • 参照型をどこでも使用する場合はどうなりますか?それに害はありますか?

また、それぞれの長所と短所についても説明してください。私もそれを理解したい。

+2

あなたが決めることができないなら、それはほぼ確実に 'クラス'です。 *合法的にstructを書くことは非常にまれです。 –

+1

トルコのプログラマーにとって、私はそれについてのブログ記事を持っています。http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ –

答えて

4

これには多くの混乱があるようですが、Jon Skeetは自分の著書「C#In Depth、2nd Ed。」でそれをクリアしています。 (セクション2.3)。

私の個人的なアプローチは、構造体/列挙体(値型)を使用して、私が何らかの論理的または数学的な方法で頻繁に使用することがわかっている軽量で原子的なデータ構造を表現することだけです操作 - 考えてPointなど

私は、私はガベージコレクションのパフォーマンスのペナルティを避けることができると私は想像した。しかしJon氏は、本書のこのセクションでは、特に新しいバージョンのランタイムでは、何かがスタック上にあるかどうかという本当の保証はないことを指摘しています。

だから私の最善の答えは、構造体のようなものを控えめに使用し、あなたがそうした場合になぜそれらを使用しているかを非常に意識していることです。早すぎる最適化に注意してください。このトピック全体を明確にする良い仕事をしているので、コピーを手に入れることができれば、Jonの本のそのセクションを読んでください。

関連:When to use struct?

7

自分自身のアイデンティティ(a 1がa 1)を持たないimmutablesの値の型を使用し、他のものの参照型を使用します。

+5

文字列にアイデンティティがあるべきですか? :) –

+0

'' 1 ''は' '1''ではありませんか? – jason

+0

@Jon - 特殊なケース...そして、文字列は値型として実装されていたはずです。あなたがそれを聞くのが大好きです。 – Oded

9

小さい値の値の型は、の値を使用して、値を表すの型を使用する必要があります。
Never make mutable structs

他のすべてについては、参照型を使用してください。

+1

+1は* small *に重点を置いています。 (コピーオンアサイン) –

+1

あなたの投稿は値の種類を使用する理由を説明していませんか? – Nawaz

2

http://www.albahari.com/valuevsreftypes.aspx

これは、この時点で私の参照です。私は主に参照型tbhを使用します。 IEクラスと構造体ではありません。多くの場合、主なポイントは、構造体は小さな情報にのみ使用されるべきであるということです。本当に正確な状況に依存します。オブジェクトブラウザの.netフレームワークを見てみると、マイクロソフトの人たちが何をしているのかが分かり、特定のクラスと構造体を作りた理由を分析できます。

1

不変値型と不変基準タイプ意味的に全てが、同一です。唯一の違いは、参照型が意味のある場合とそうでない場合の参照平等チェックをサポートしており、参照型が暗黙的にNULL可能である間に値型がNullable(Of T)でラップされる点です。タイプが不変になる場合、その使用方法に応じて、構造体またはクラスを優先するパフォーマンス上の理由がある可能性があります。構造体はいくつかの操作(4バイト未満のサイズの場合、ほぼすべての操作)が高速ですが、クラスはいくつかのもの(特に16バイトを超えるもの)のほうが高速です。さらに、いくつかのタイプの操作は基本的に構造体では不可能です。

変更可能な構造体型は、一部の要所主張者とは反対に有用ですが、いくつかの注意点があります。変更可能なクラスオブジェクトへの参照を保持する変数を持ち、そのオブジェクトを変更する何かを行う変数があれば、その変更はそのオブジェクトへの参照を保持するすべてのものによって効果的に「見られる」でしょう。他に何も妨害することなくオブジェクトを変更したい場合、そのオブジェクトへの唯一の参照を保持していることを知る必要があります。多くの場合、これを確実にする唯一の方法は、オブジェクトのすべてのデータを新しいオブジェクトインスタンスにコピーし、その新しいインスタンスに変更を加えることです。対照的に、変更可能な構造体がある場合、新しいインスタンスを作成する必要なしに、変更を簡単に行うことができます。

変更可能な構造体の唯一の実際の問題は、.netがさまざまな抽象化を使用して統一型システムの一部として動作することであり、これらの抽象化によって、構造のコピーが論理的に使用されるべき場所。これらの置換がいつ起こるかは必ずしも明白ではなく、混乱して誤動作する可能性があります。