構造体のデザイン
Note
このコンテンツは、Pearson Education, Inc. の許可を得て、『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition (フレームワーク設計ガイドライン: 再利用可能な .NET ライブラリの規約、表現形式、およびパターン、第 2 版)』から転載されています。 この版は 2008 年に出版され、その後、この本は第 3 版で全面的に改訂されました。 このページの情報の一部は古くなっている可能性があります。
汎用の値型は、ほとんどの場合、構造体と呼ばれます。これは C# のキーワードです。 このセクションでは、一般的な構造体の設計に関するガイドラインを示します。
❌ 構造体に対して、パラメーターのないコンストラクターを使用しないでください。
このガイドラインに従うことで、配列の各項目にコンストラクターを実行することなく、構造体の配列を作成できます。 C# では、構造体でパラメーターのないコンストラクターは使用できないことに注意してください。
❌ 変更可能な値型を定義しないでください。
変更可能な値型にはいくつかの問題があります。 たとえば、プロパティ ゲッターによって値型が返される場合、呼び出し元はコピーを受け取ります。 コピーは暗黙的に作成されるため、開発者は、元の値ではなくコピーを変更していることに気付かないことがあります。 また、一部の言語 (特に動的言語) では、ローカル変数であっても逆参照されるときにコピーが作成されるため、変更可能な値型の使用で問題が発生します。
✔️ すべてのインスタンス データが 0、false、または null (必要に応じて) に設定された状態が有効であるようにしてください。
これにより、構造体の配列が作成されるときに、無効なインスタンスが誤って作成されることが防止されます。
✔️ 値型に IEquatable<T> を実装してください。
値型の Object.Equals メソッドによってボックス化が発生しますが、リフレクションが使用されるため、既定の実装はあまり効率的ではありません。 Equals のほうがパフォーマンスがはるかに優れており、ボックス化が発生しないように実装できます。
❌ValueType を明示的に拡張しないでください。 実際、ほとんどの言語ではこれは禁止されています。
一般に、構造体は非常に有用ですが、頻繁にボックス化されない小さな単一の変更できない値に対してのみ使用するようにしてください。
Portions © 2005, 2009 Microsoft Corporation. All rights reserved.
2008 年 10 月 22 日に Microsoft Windows Development シリーズの一部として、Addison-Wesley Professional によって発行された、Krzysztof Cwalina および Brad Abrams による「Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition」 (フレームワーク デザイン ガイドライン: 再利用可能な .NET ライブラリの規則、用法、パターン、第 2 版) から Pearson Education, Inc. の許可を得て再印刷されています。