header

■データ型

C#のデータ型についてまとめます。
ほとんどが見慣れた名前の型ばかりですが
いくつかC#ならではのものがあります。

値型一覧
C#のデータ型は 大きく分けて 値型 と 参照型 があります。 本節では値型について説明します。 (参照型は別節にて後述) +--------------------------------------------------------------------------------------------+ | 型 内容 サイズ | +--------------------------------------------------------------------------------------------+ | 整数型 | | sbyte -128 〜 127 符号付き 8ビット | | byte 0 〜 255 符号なし 8ビット | | char U+0000 〜 U+ffff Unicode 16ビット文字| | short -32,768 〜 32,767 符号付き 16ビット | | ushort 0 〜 65,535 符号なし 16ビット | | int -2,147,483,648 〜 2,147,483,647 符号付き 32ビット | | uint 0 〜 4,294,967,295 符号なし 32ビット | | long -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 符号付き 64ビット | | ulong 0 〜 18,446,744,073,709,551,615 符号なし 64ビット | | decimal ±1.0 × 10の-28乗 〜 ±7.9 × 10の28乗 符号付き 128ビット | | | | 浮動小数点型 | | float ±1.5 × 10の-45乗 〜 ±3.4 × 10の38乗 符号付き 32ビット | | double ±5.0 × 10の-324乗 〜 ±1.7 × 10の308乗 符号付き 64ビット | | | | bool型 | | bool true または false 1バイト | | | | 列挙型 | | enum 列挙された整数(後述) 基本的にはint型と同じ| | | | 構造体 | | struct ユーザー定義(後述) 定義内容による | +--------------------------------------------------------------------------------------------+ 見慣れた型の中に、いくつかC#ならではのものがありますので補足します。
【char型】
    C,C++のchar型は8ビットで1文字を表しましたが
    C#のchar型はUnicodeで表現するため16ビット長となります。

    なお、8ビットのASCII文字(0〜127)は
    UnicodeのサブセットであるためC#でも利用可能です。

    注意点としては、char型は整数型ですが、
    数値を代入することはできません。
    以下のコードはエラーとなります。

        char c = 10;    // 整数を代入することはできません

    Unicodeを採用することで
    文字種が8ビットで収まらないような国の文字を扱うことができますし
    多言語環境への移植性を高めることが狙いです。
【decimal型】
    財務計算を行うための型です。
    主に金銭に関する計算を行う際に利用します。
【bool型】
    trueかfalseのどちらかを格納する型です。
    二者択一なので1ビットで表現可能ですが、
    後述するsizseof演算子で調べると
    1バイトのエリアを使用しているようです。
既定値
C#では、宣言されただけで初期化されていない変数は利用できません。 未割り当ての変数が使用されるとしてコンパイルエラーとなります。 以下のコードはコンパイルエラーとなります。 (C,C++ではエラーとならず、変数の値は不定となりBugの原因にもなります) int a; 中略 Console.WriteLine( "{0}", a ); // 初期化されていないのでエラー 次のように宣言と同時に初期値を設定することもできますが int a = 1; 変数の型のコンストラクタを呼び出すことで、 その型の既定値を設定することができます。↓ int a = new int(); // aはint型の既定値である0で初期化されます 各型の既定値(コンストラクタが返す初期値)は以下の通りです。 数値型は0、char型は'\0'、bool型はfalseが既定値です。 +-------------------------------------------------------------------------------------+ | 型 既定値 | +-------------------------------------------------------------------------------------+ | bool false | | byte 0 | | char '\0' | | decimal 0.0M | | double 0.0D | | enum 式(列挙型識別子E)0 によって算出された値。 | | float 0.0F | | int 0 | | long 0L | | sbyte 0 | | short 0 | | struct 値型フィールドは既定値が設定され、参照型フィールドはnullに設定されます。| | uint 0 | | ulong 0 | | ushort 0 | +-------------------------------------------------------------------------------------+
列挙型
C,C++でお馴染みの列挙型です。 その名の通り、整数に名前を付けて、それを列挙し、まとめたものです。 例えば、赤、青、黄、のような色を整数で表し、 それを列挙型として宣言すると次のようになります。
【書式】
    enum 列挙型名 { 名前, 名前, 名前, 続く... };
【例】
    enum enColor { red, blue, yellow };
各要素はカンマで区切ります。 デフォルトでは、先頭要素のredには0が割り当てられ、 以後、1ずつインクリメントされます。 blueは1、yellowは2となります。 特に、各要素に対して任意を値を与えたい場合は次のようにします。
【例】
    enum enColor { red, blue=10, yellow };
この時、各値は red = 0 blue = 10 yellow =11 となります。 すべての値に任意の値を指定しても良いですし 指定しなければ、先頭要素はデフォルトの0が設定され 2番目以降の要素は、 ひとつ前の要素に1つインクリメントした値が設定されます。
【補足1】
    C,C++では関数スコープ内で列挙型が定義できましたが
    C#では関数内に定義できません。
    クラススコープ(クラスのメンバ変数を定義する位置)もしくは
    ファイルスコープ(クラスを定義する位置)
    で定義します。
【補足2】
    基本的に、列挙型の各値はint型の整数として定義されますが
    他の整数型を指定して定義することも可能です。
    (但し、char型を除く)
    次の例はbyte型の列挙型を定義しています。

【例】
        enum enColor : byte { red, blue, yellow };
【補足3】
    列挙型を利用するメリットについてですが
    例えば、先ほどの例のように
    色を表す整数型の変数を定義したとします。

    色は全部で3種類(赤、青、黄)あり、
    それ以外の色(値)は存在せず、変数に設定したくはありません。

    これを列挙型ではなく、int型で表すと
    int型は単なる整数型なので
    赤なら0、青なら1、黄なら2、と決めても、それ以外にも
    int型の範囲内の整数ならどんな値でも入ってしまいます。

    しかし列挙型であれば
    red, blue, yellow のように
    あらかじめ定義されていない名前の値は代入できないので

    次のようなコードはエラーとなります。
【例】
    class Class1
    {
        enum enColor { red, blue, yellow };

        /// 
        /// アプリケーションのメイン エントリ ポイントです。
        /// 
        [STAThread]
        static void Main(string[] args)
        {
            enColor col = new enColor();

            col = enColor.red;      // red を設定します。
            col = enColor.black;    // black は定義されていません。エラー
            col = 1;                // 整数を直接代入できません。エラー

構造体
C#にも構造体があります。 構造体とは、いくつかのデータをまとめて ひとつの大きな型として定義するユーザ定義型のことです。 C++の構造体は メンバーがデフォルトでpublicとなるクラスのようなものでしたが C#では構造体とクラスは別ものです。 具体的には、クラスは参照型ですが、構造体は値型です。
【書式】
    struct 構造体名
    {
        メンバの宣言
    }
例として、身長と体重を表す整数型をまとめた構造体を定義し、 それぞれに初期値を設定して出力します。 メンバーがpublicと宣言されている点に注意してください。 publicを省略するとデフォルトでprivateとなり メンバーを参照することができません。
【例】
    class Class1
    {
        public struct stStudent
        {
            public int  height; // 身長
            public int  weight; // 体重

            // 初期値を設定するためのコンストラクタを定義できます
            public stStudent( int h, int w )
            {
                height = h;
                weight = w;
            }
        }

        /// 
        /// アプリケーションのメイン エントリ ポイントです。
        /// 
        [STAThread]
        static void Main(string[] args)
        {
            stStudent stYamada = new stStudent(170, 60);

            Console.WriteLine( "身長={0} 体重={1}", stYamada.height, stYamada.weight );
【補足1】
    上記例でもわかるように、
    構造体には、クラスのようにメソッドを定義可能です。
    他にも後述する
        ・インデクサ
        ・プロパティ
        ・イベント
        ・演算子メソッド
    といったものを定義可能です。

    但し、デフォルトコンストラクタ(引数の無いコンストラクタ)
    は自動的に定義されるため、別途ユーザが記述することはできません。

    また、上記例をnewを使わずに

        stStudent stYamata;

    とだけ宣言することも可能ですが、構造体内のメンバーは初期化されません。
【補足2】
    構造体のメンバーとして、さらに入れ子で構造体を定義できます。

        public struct stStudent
        {
            public int  height;     // 身長
            public int  weight;     // 体重

            public struct stTest    // テストの得点
            {
                int kokugo;
                int sansu;
                int rika;
                int shakai;
                int eigo;
            }

            以下略




Copyright © 2008.07 - shougo suzaki