クラスまたは構造体の選択Choosing Between Class and Struct

すべての framework デザイナーに直面して基本的な設計上の決定の 1 つは、クラス (参照型)、または構造体 (値型) として型をデザインするかどうかです。One of the basic design decisions every framework designer faces is whether to design a type as a class (a reference type) or as a struct (a value type). 参照型と値の型の動作の違いをよく理解は、このオプションを選択する際に非常に重要です。Good understanding of the differences in the behavior of reference types and value types is crucial in making this choice.

最初の間に違いが参照型と値の型を検討します。 はある参照型と、ガベージ コレクション ヒープに割り当てられている値の型が割り当てられたスタックのいずれかまたはインラインでを含む型し割り当て解除されたときに対し、スタックアンワインドを取得、含んでいる型の割り当てを解除する場合またはします。The first difference between reference types and value types we will consider is that reference types are allocated on the heap and garbage-collected, whereas value types are allocated either on the stack or inline in containing types and deallocated when the stack unwinds or when their containing type gets deallocated. したがって、値型の割り当てと解放は一般に参照型の割り当てと解放より低コストです。Therefore, allocations and deallocations of value types are in general cheaper than allocations and deallocations of reference types.

次に、参照型の配列ではの不一致、つまり、配列要素に、ヒープ上に存在する参照型のインスタンスへの単なる参照が割り当てられます。Next, arrays of reference types are allocated out-of-line, meaning the array elements are just references to instances of the reference type residing on the heap. 値型の配列には、インライン、つまり、配列要素値の型の実際のインスタンスが割り当てられます。Value type arrays are allocated inline, meaning that the array elements are the actual instances of the value type. そのため、値型の配列の割り当てと解放は、参照型の配列の割り当てと解放よりはるかに安いです。Therefore, allocations and deallocations of value type arrays are much cheaper than allocations and deallocations of reference type arrays. さらに、多くの場合は、値型の配列と、参照の局所性量が高くが発生します。In addition, in a majority of cases value type arrays exhibit much better locality of reference.

次の相違点については、メモリ使用量に関連します。The next difference is related to memory usage. 値型は、参照型または実装するインターフェイスの 1 つにキャストするときをボックス化を取得します。Value types get boxed when cast to a reference type or one of the interfaces they implement. ボックス化解除された取得した値の型にキャストされる場合。They get unboxed when cast back to the value type. ボックスは、ヒープで割り当てられるし、は、ガベージ コレクション、あまりボックス化およびボックス化解除されるオブジェクトであるため、ヒープ、ガベージ コレクターと最終的には、アプリケーションのパフォーマンスに悪影響を与えることができます。Because boxes are objects that are allocated on the heap and are garbage-collected, too much boxing and unboxing can have a negative impact on the heap, the garbage collector, and ultimately the performance of the application. これに対し、このようなボックス化は行われませんように参照型にキャストされます。In contrast, no such boxing occurs as reference types are cast.

次に、参照型の割り当ては、値型の割り当て値全体をコピーする一方、参照をコピーします。Next, reference type assignments copy the reference, whereas value type assignments copy the entire value. したがって、大規模な参照型の割り当ては、大きな値の型の割り当てよりも安価です。Therefore, assignments of large reference types are cheaper than assignments of large value types.

最後に、値の型が値によって渡されるが、参照型は、参照によって渡されます。Finally, reference types are passed by reference, whereas value types are passed by value. 参照型のインスタンスへの変更では、インスタンスを指すすべての参照に影響します。Changes to an instance of a reference type affect all references pointing to the instance. 値型のインスタンスは、値によって渡されるときにコピーされます。Value type instances are copied when they are passed by value. 値型のインスタンスが変更されたときに、もちろんには影響しません、そのコピーのいずれか。When an instance of a value type is changed, it of course does not affect any of its copies. コピーは、ユーザーによって明示的に作成されませんが、引数が渡されるまたは返される値を返すときに暗黙的に作成された、変更可能な値の型が多数のユーザーに混乱する可能性です。Because the copies are not created explicitly by the user but are implicitly created when arguments are passed or return values are returned, value types that can be changed can be confusing to many users. そのため、値の型は変更できません。Therefore, value types should be immutable.

原則として、として、framework の型の大部分は、クラスをする必要があります。As a rule of thumb, the majority of types in a framework should be classes. ただし、状況によっては、値型の特性ように構造体を使用する適切ながあります。There are, however, some situations in which the characteristics of a value type make it more appropriate to use structs.

✓ CONSIDER 型のインスタンスは小さく、一般的な有効期間が短いまたはその他のオブジェクトに埋め込まれている一般的な場合は、クラスの代わりに構造体を定義することです。✓ CONSIDER defining a struct instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.

X AVOID すべて次の特徴の種類があるない限り、構造体を定義します。X AVOID defining a struct unless the type has all of the following characteristics:

  • プリミティブ型のような単一の値を論理的に表す (intdouble, などです。)。It logically represents a single value, similar to primitive types (int, double, etc.).

  • 16 バイト未満のサイズのインスタンスがあります。It has an instance size under 16 bytes.

  • 変更可能なことはできません。It is immutable.

  • 頻繁にボックス化することはありません。It will not have to be boxed frequently.

その他のすべてのケースでクラスとして、型を定義する必要があります。In all other cases, you should define your types as classes.

部分 © 2005、2009 Microsoft Corporation します。All rights reserved.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

ピアソン教育, Inc. からのアクセス許可によって検出Framework デザイン ガイドライン: 規則、表現方法、および再利用可能な .NET ライブラリを第 2 版パターンは Cwalina と Brad Abrams、2008 年 10 月 22 日で発行されました。Microsoft Windows 開発シリーズの一部として、Addison-wesley Professional。Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

関連項目See Also

型デザインのガイドラインType Design Guidelines
フレームワーク デザインのガイドラインFramework Design Guidelines