.NET Visual C#言語入門 > 構造体(struct)
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
構造体(struct)
構造体は、様々なデータ型の変数を一つにまとめたデータ型です。
構造体は、structキーワードで定義します。
public struct PostalAddress { // Fields, properties, methods and events go here... // フィールド、プロパティ、メソッド、イベントを記述 // 公開フィールドは public 宣言する }
構造体は構文上クラスとほとんど変わりませんが、次に示す点が制限されます。
- 構造体インスタンス フィールドの宣言では、初期化子を使用できませんが、構造体の静的フィールドは初期化できます。
- 構造体では、既定のコンストラクタ (パラメータなしのコンストラクタ) やデストラクタを宣言できません。
- 構造体は、クラスや他の構造体を継承できません。
構造体のコピーは、コンパイラによって自動的に作成され、破棄されるので、既定のコンストラクタやデストラクタは不要です。コンパイラは、すべて既定値のフィールドを代入することにより事実上既定のコンストラクタを実装します。
構造体の特徴
- 構造体は、値型です(クラスは参照型)
- 構造体を、メソッドに渡すときは値渡しです(参照渡しでありません)
- 構造体は、new演算子を使用せずにインスタンス化可能
- 構造体は、パラメータ付のコンストラクタを宣言できます
- 構造体は、継承も派生もできません
すべての構造体は System.ValueType を直接継承し、System.ValueType は System.Object を継承します - 構造体は、インターフェイスを実装できます
- 構造体のインスタンス・フィールドを初期化するとエラーになります
メソッドに構造体を渡すこととクラス参照を渡すことの違い
構造体がメソッドに渡されるときは構造体のコピーが渡されますが、クラス・インスタンスが渡されるときは参照が渡されます。
使用例
この例の出力は、クラス インスタンスを ClassTakerメソッドに渡すと、クラス フィールドの値だけを変更します。
構造体フィールドは、そのインスタンスを StructTakerメソッドに渡しても変更されません。これは、クラス参照が ClassTakerメソッドに渡されるのに対し、構造体のコピーが StructTakerメソッドに渡されるからです。
class TheClass { public string willIChange; } struct TheStruct { public string willIChange; } class TestClassAndStruct { static void ClassTaker(TheClass c) { c.willIChange = "Changed"; } static void StructTaker(TheStruct s) { s.willIChange = "Changed"; } static void Main() { TheClass testClass = new TheClass(); TheStruct testStruct = new TheStruct(); testClass.willIChange = "Not Changed"; testStruct.willIChange = "Not Changed"; ClassTaker(testClass); StructTaker(testStruct); System.Console.WriteLine("Class field = {0}", testClass.willIChange); System.Console.WriteLine("Struct field = {0}", testStruct.willIChange); } }
出力
Class field = Changed Struct field = Not Changed