クラスまたは構造体の選択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. 値型は、参照型またはいずれかを実装するインターフェイスにキャストするときをボックス化を取得します。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. (詳細については、次を参照してください。ボックス化とボックス化解除)。(For more information, see Boxing and Unboxing).

次に、参照型の割り当ては、値型の割り当て値全体をコピーする一方、参照をコピーします。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.

一般に、フレームワーク内の型の大部分は、クラスできなければなりません。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:

  • プリミティブ型のような 1 つの値を論理的に表す (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.

Portions © 2005, 2009 Microsoft Corporation.All rights reserved.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Pearson Education, Inc. からのアクセス許可によって了承を得て転載Framework デザイン ガイドライン。規則、手法、および再利用可能な .NET ライブラリの第 2 版のパターンKrzysztof Cwalina、Brad 内容では、Microsoft Windows の開発シリーズの一部として、Addison-wesley Professional、2008 年 10 月 22日を公開します。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