Top > .NET Visual C#言語入門 > 構造体(struct)
プログラム構造 列挙型(enum) コンストラクタ・デストラクタ
スケルトン 配列 メソッド
クラス内の記述構成 構造体 プロパティ
HalloWorld 修飾子 静的クラスと静的メンバ
コマンドライン引数 プリプロセッサ ディレクティブ フィールド
コメント 例外と例外処理 演算子のオーバーロード
ステートメント(文) 可変個引数リスト(params) イベント(割り込み)
式(演算子) 名前空間 デリゲート
変数とデータ型 クラスとオブジェクト インデクサ
型変換(キャスト) クラス(class) デリゲート&イベント発生と受信サンプル
定数(Const/Readonly) 部分クラス定義  
文字列(string) 継承  

構造体(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

 

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします