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

変数とデータ型

プログラムにおける変数とは

値の格納・参照だけではありません。.NET FrameWork用の言語の場合、型も一つのオブジェクトの一つです。

C++言語の「言語仕様の型で宣言された変数」は、値の格納と参照というC言語仕様をそのまま継承しています。ところが、C#言語など.NET FrameWork言語の場合、全てがオブジェクト(構造体)として実装されます。この変換はコンパイラが自動できに行います。

フィールド名、プロパティ名、メソッド名、変数名など、全角文字(漢字)を使用することができます。

int 漢字 = 10;
Console.WriteLine("漢字=" + 漢字.ToString());
  • 「メモリ構造とデータ型」も参照して下さい。

目次

  • 型種類
    値型と参照型
  • 変数(データ構造)
  • 組み込み型の一覧表
  • 整数型の一覧表
  • 浮動小数点型の一覧表
  • 既定値の一覧表
  • 値型
  • 暗黙の数値変換
  • 明示的な数値変換の一覧表
  • 数値型の出力書式の詳細については、「数値結果の書式指定の一覧表」を参照してください。

型種類

型の種類 サイズ 範囲
値型 数値型 整数型 sbyte 符号付き 8 ビット整数 -128 ~ 127
byte 0 ~ 255 符号なし8ビット整数
char U+0000 ~ U+ffff Unicode16ビット文字
short -32,768 ~ 32,767 符号付き16ビット整数
ushort 0 ~ 65,535 ※ushortの「u」は、unsignedのこと 符号なし16ビット整数
int -2,147,483,648 ~ 2,147,483,647 ※intは、integerの略 符号付き32ビット整数
uint 0 ~ 4,294,967,295 ※uintの”u”は、unsignedの意味 符号なし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 ※ulong の”u”は、unsignedの意味 符号なし64ビット整数
浮動小数点型 float ±1.5e − 45 ~ ±3.4e38 7桁
double ±5.0e − 324 ~ ±1.7e308 15~16桁
デシマル decimal ±1.0 × 10e − 28 ~ ±7.9 × 10e28 128ビット(28 ~29桁)
論理値型 bool ブール値 (true および false)  
構造体型 struct 構造体には、
コンストラクタ、定数、フィールド、メソッド、プロパティ、
インデクサ、演算子、イベント、
および入れ子にされた型を含めることもできます
 
列挙体型 enum 数値に名前を定義し、コード上では定義された名前を使用  
参照型 クラス class    
デリゲート delegate    
文字列型 string    
オブジェクト型 object    
インターフェイス interface    
  void メソッドが値を戻さない場合、メソッドの戻り値の型として void を使用する

※色つき(太字)は必須キーワード

解説

C#の型(組込み型、クラス、構造体、列挙型)には大きく分けて2つのタイプがあります。 1つは値型と呼ばれるもので、もう1つは参照型と呼ばれるものです。

値型と参照型の違い

値型(value type)と参照型(reference type)の違いは、その名の通り、その型の値を直に保持するか、値の参照を保持するかです。

// 値型(構造体は値型)

struct SampleData
{
    public int Value;

    public SetData(int Val)
    {
        this.Value = Val;
    }

    public override string ToString()
    {
        return "[" + this.Value + "]";
    }
}

class ValueTypeSample
{
    public static void Main()
    {
        Point A = new SampleData(100);
        Point B = A;	// A構造体値をB構造体へ代入
        Point C = A;	// A構造体値をC構造体へ代入

        // 引数 A,B,CはToString()が実行される(記述省略)
        Console.WriteLine("A={0}, B={1}, C={2}", A, B, C);

        B.Value = 0;	// 構造体Bの変数Value値を変更
        Console.WriteLine("A={0}, B={1}, C={2}", A, B, C);
    }
}
この2つのコードは、SampleDataが構造体かクラスかの違いだけで、他は全く同じです。
// 参照型(クラスは参照型)

class SampleData
{
    public int Value;	// 変数の公開は望ましくない(テスト用)

    public SetData(int Val)
    {
        this.Value = Val;
    }

    public override string ToString()
    {
        return "[" + this.Value + "]";
    }
}

class ValueTypeSample
{
    public static void Main()
    {
        Point A = new SampleData(100);
        Point B = A;	// A構造体値をB構造体へ代入
        Point C = A;	// A構造体値をC構造体へ代入

        // 引数 A,B,CはToString()が実行される(記述省略)
        Console.WriteLine("A={0}, B={1}, C={2}", A, B, C);

        B.Value = 0;	// 構造体Bの変数Value値を変更
        Console.WriteLine("A={0}, B={1}, C={2}", A, B, C);
    }
}

コード解説

値型サンプルでは、構造体を初期化してAに代入します。
 参照型サンプルでは、クラスのインスタンス(実態)を指す参照先をAに代入します。

B, Cに、Aの値を代入し、3つの変数が同じ値であることを画面上で確認します。
 その後、B.xの値だけを変更し、再び画面上で確認します。出力結果は以下のようになります。

値型の場合
A=[100], B=[100], C=[100]
A=[100], B=[0], C=[100]
参照型の場合
A=[100], B=[100], C=[100]
A=[0], B=[0], C=[0]

値型(構造体)は、B.xの値だけが変更され、参照型(クラス)は、A,B,Cともに変更されます。

この違いは、

  • 値型は自分自身のデータ領域を持っていて、代入時にその領域をコピーします。したがって、A,B,Cともに独立したデータ領域を持っていることになります。
  • 参照型は、実態はヒープ領域に作成され、オブジェクトはその領域の参照先を持っています。したがって、代入時は実体への参照先がコピーされます。

変数(データ構造)

変数とは、プログラム上で使用するデータ格納するためのもので、全ての変数は型を持っています。

組み込み型の一覧表

C# の組み込み型のキーワードは、次のとおりです。これらは、System 名前空間で定義されている型のエイリアスです。

C# 型 .NET Framework 型
bool System.Boolean
byte System.Byte
sbyte System.SByte
char System.Char
decimal System.Decimal
double System.Double
float System.Single
int System.Int32
uint System.UInt32
long System.Int64
ulong System.UInt64
object System.Object
short System.Int16
ushort System.UInt16
string System.String

「エイリアス」とは「別名」という意味で、実態は.NET Framework型です。

解説

表内の objectstring を除くすべての型は、単純型と呼ばれます。

C# 型のキーワードとエイリアスは、相互に交換できます。たとえば、整数の変数を宣言する場合は、次のいずれかの宣言を使用できます。

int x = 123;
System.Int32 x = 123;

C# 型の実際の型を表示するには、GetType() システム メソッドを使用します。たとえば、myVariable の型を表すシステム エイリアスを表示するには、次のステートメントを使用します。

Console.WriteLine(myVariable.GetType());

また、typeof 演算子も使用できます。

整数型の一覧表

単純型のサブセットである整数型のサイズと範囲は、次のとおりです。

範囲 サイズ
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 ビット整数

浮動小数点型の一覧表

浮動小数点型の有効桁数とおおよその範囲は、次のとおりです。

おおよその範囲 有効桁数
float ±1.5e − 45 ~ ±3.4e38 7 桁
double ±5.0e − 324 ~ ±1.7e308 15 ~ 16 桁

既定値の一覧表

既定のコンストラクタから返される値型の既定値は、次のとおりです。既定のコンストラクタを呼び出すには、new 演算子を次のように使用します。
 C#では、初期化する前の変数は使用できないことに注意してください。

int myInt = new int();
次のステートメントは、上のステートメントと同じ結果になります。
int myInt = 0;
値型 既定値
bool false
byte 0
char '\0'
decimal 0.0M
double 0.0D
enum 式 (E)0 によって算出された値。E は、列挙の識別子です。
float 0.0F
int 0
long 0L
sbyte 0
short 0
struct すべての値型フィールドを既定値に設定し、
すべての参照型フィールドを null に設定して算出された値。
uint 0
ulong 0
ushort 0

値型の一覧表

次の表に、C# の値型をカテゴリ別に示します。

値型 カテゴリ
bool ブール値
byte 整数値 (符号なし)
char 整数値 (符号なし)
decimal 10 進数値
double 浮動小数点数値
enum 列挙値
float 浮動小数点数値
int 整数値 (符号付き)
long 整数値 (符号付き)
sbyte 整数値 (符号付き)
short 整数値 (符号付き)
struct ユーザー定義の構造体
uint 整数値 (符号なし)
ulong 整数値 (符号なし)
ushort 整数値 (符号なし)

暗黙的な数値変換の一覧表

組み込まれた暗黙の数値変換を次に示します。暗黙の変換は、メソッドの呼び出しや代入ステートメントなど、多くの状況で発生することがあります。

変換前(MSDN) 変換後
sbyte short、int、long、float、double、decimal
byte short、ushort、int、uint、long、ulong、float、double、decimal
short int、long、float、double、decimal
ushokrt int、uint、long、ulong、float、double、decimal
int long、float、double、decimal
uint long、ulong、float、double、decimal
long float、double、decimal
char ushort、int、 uint、 long、ulong、 float、 double、decimal
float double
ulong float、 double、decimal

明示的な数値変換の一覧表

暗黙の型変換が行われない場合に、明示的な数値の変換を行います。キャスト式を使用して任意の数値型を他の数値型に変換します。これらの変換を次に示します。

変換前 変換後
sbyte byte、ushort、uint、ulong、char
byte Sbyte char
short sbyte、 byte、 ushort、 uint、 ulong、char
ushort sbyte、 byte、 short、char
int sbyte、 byte、 short、 ushort、 uint、 ulong、 char
uint sbyte、byte、 short、 ushort、 int、char
long sbyte、 byte、 short、 ushort、 int、 uint、 ulong、char
ulong sbyte、 byte、 short、 ushort、 int、 uint、 long、または char
char sbyte、byte、short
float sbyte、 byte、 short、 ushort、 int、 uint、 long、 ulong
char、decimal
double sbyte、 byte、 short、 ushort、 int、 uint、 long、 ulong
char、 float、  decimal
decimal sbyte、 byte、 short、 ushort、 int、 uint、 long、 ulong
char、 float、 double

解説

  • 明示的な数値変換によって、有効桁数が桁落ちしたり、例外がスローされる場合があります。
  • decimal 値を整数型に変換すると、値は一番近い整数値に丸められます。結果の整数値が変換先の型の範囲を超えた場合は、OverflowException がスローされます。
  • double 値または float 値を整数型に変換すると、値が切り捨てられます。整数値が、変換後の値の範囲を超えた場合は、オーバーフロー チェック コンテキストに従います。checked コンテキストでは、OverflowException がスローされます。これに対して、unchecked コンテキストでは、変換後の型の未指定値に変換されます。
  • double から float への変換では、double 値は最も近い float 値に丸められます。double 値が、変換後の型の範囲外であるため格納できない場合は、0 または無限大になります。
  • float または double から decimal への変換では、変換前の値が decimal 表記に変換され、必要に応じて小数第 28 位までの近似値に丸められます。変換元の値に応じて、次のいずれかが生じる場合があります。
    • 変換元の値が小さすぎて decimal で表すことができない場合、結果は 0 になります。
    • 変換元の値が非数 (NaN)、無限大、または大きすぎて decimal で表すことができない場合は、OverflowException がスローされます。
  • decimal から float または double への変換では、decimal 値は最も近い double 値または float 値に丸められます。

明示的な変換の詳細については、『C# 言語仕様』の「6.2 明示的な変換」を参照してください。仕様にアクセスする方法の詳細については、「C# 言語仕様」を参照してください。

数値結果テーブルの書式設定

数値結果の書式を指定するには、String.Format メソッドを使用するか、String.Format を呼び出す Console.Write メソッドを使用します。書式を指定するには、書式指定文字列を使用します。サポートされる標準の書式指定文字列を次の表に示します。書式指定文字列は Axx という形式になります。ここで、A は書式指定子、xx は精度指定子です。書式指定子は、数値に適用する書式の種類を制御し、有効桁数指定子は、書式付き出力の有効桁数または小数点以下の桁数を制御します。

標準およびカスタムの書式指定文字列の詳細については、「書式設定の概要」を参照してください。String.Format メソッドの詳細については、「System.String.Format」を参照してください。

文字 説明 出力
C または c 通貨 Console.Write("{0:C}", 2.5);
Console.Write("{0:C}", -2.5);
$2.50
($2.50)
D または d 10 進数 Console.Write("{0:D5}", 25); 00025
E または e 指数 Console.Write("{0:E}", 250000); 2.500000E+005
F または f 固定小数点 Console.Write("{0:F2}", 25);
Console.Write("{0:F0}", 25);
25.00
25
G または g 汎用 Console.Write("{0:G}", 2.5); 2.5
N または n 番号 Console.Write("{0:N}", 2500000); 2,500,000.00
X または x 16 進数 Console.Write("{0:X}", 250);
Console.Write("{0:X}", 0xffff);
FA
FFFF

▲ページトップに戻る

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