前回は、変数のスコープをやりました。今回は、構造体です。

構造体は、いくつもの変数をひとまとめにしてグループ化することが出来ます。後に説明するクラスと違い値型であるのが特徴的です。(値型については、前回の関数の参照型渡しをご覧ください)また、クラスより軽量であるため、大量のデータを扱うときに使用すれば、高速に処理が出来ます(差がほとんど感じられない場合もありますが)。クラスと使い分けて使用できれば、上級プログラマーの仲間入りですね(・∀・)つ

構文

アクセス修飾子 struct 構造体の名前{
        アクセス修飾子  変数;
        アクセス修飾子  変数;・・・
        public 構造体名(引数){
            初期化;
        }
    }

C#

public class Kouzoutai{
    public struct person{
        public string name;
        public int age;
        //private weight; // privateを書くとコンパイラによってはエラー
        public person(string nm,int ag){
            name=nm;
            age=ag; 
        }
    }
    public static void Main(){
        person p1;
        p1.age = 15;
        p1.name = "hoge";
        System.Console.WriteLine("name={0},age={1}",p1.name,p1.age);
        person p2 = new person("foo" ,23);
        System.Console.WriteLine("name={0},age={1}",p2.name,p2.age);
    }
}

結果

name=hoge,age=15
name=foo,age=23


最初に、personという構造体を定義しています。変数の前にpublicというアクセス装飾子が付いています。これは、外部から変数にアクセス出来ることを意味しています。詳しくは、クラス変数のスコープなどで説明します。privateというアクセス装飾子もありますが、構造体で使うとコンパイルエラーになる場合があります。

person構造体内にnameage変数を定義しています。

下にはperson(){~};と記述しています。これは関数と違って少し特殊なものです。コンストラクタと呼び、構造体をnewしたときに処理されます。構造体の初期化などに使用します。

main関数内では、「初期化せずに値をセットする方法」と「newして初期化する方法」のサンプルです。構造体の内部変数への参照は、ドット(.)を使い、"構造体変数名.内部変数"と書きます。
newもコンストラクタが呼ばれ値がセットされている様子が分かります。

最後に、Console.WriteLine関数でフォーマットを指定して出力しています。
WriteLineの第二引数が"{0}"に入り、第三引数が"{1}"に入る書き方です。第四引数もあれば"{数字}"で追加できます。このフォーマットというものは、固定の文字列の一部を加えるときに重宝します。フォーマットされた文字列を返すString.Format(文字列,第一引数,第二引数・・・)関数でも同じようなことが出来ます。


構造体の余談

C#は.Net Framework(以下.Net)の膨大なライブラリを使用するために開発された今どきな言語です。.Net内では多くの構造体が使われていますが、プログラムを始めたばかりは、特に構造体を作成する機会も少ないのではないでしょうか?.Netの用意してある構造体を使い、どのようなものなのか肌で感じるのもいいのかもしれません。

それでも構造体を利用する機会はたまにあります。

C言語で作られたライブラリ(DLLファイル)などの引数に構造体を使っていたりします。C++言語が出てくる前なのでクラスがなかったこともありますが・・・。

WindowsのOSの機能を呼び出すインターフェースをWinAPI(アプリケーションインターフェース)といいます。これは.Netから直接コールできないのです。また、これをアンマネージコードといいます。因みに、マネージコードとは、.Netのライブラリにあたり、参照さえすれば特に意識することなく簡単に呼び出せるものです。こんな話をしていますが、最新の.Netバージョンを使えばアンマネージコードすら呼ぶ機会も少なくなりましたが・・・。

次回は、C#で.Netを使うにあたって重要なクラスに触れていきます。そして、Windowsプログラムの入り口へ。