C#で最初から使用できる型を組み込み型と言います。
範囲使用できる範囲をすぐ忘れてしまうので自分のためにまとめてみました。
C# は int や double など、他の型のある言語で利用できる型がC#にも用意されています。組み込み型の特徴は以下の通りです。
- .NETでは数値型のサイズは環境に依らず全て同じ
- → 環境が変わってもサイズが変わらない
- フィールドで初期化せずに宣言すると初期値は整数は「0」、浮動小数は「0.0」
- 全て「値型」となる。← 後述
整数の組み込み型
整数を扱える組み込み型は以下の通りです。
type | byte | Signed | 範囲 |
---|---|---|---|
sbyte | 1 | Yes | -128 ~ 127 |
byte | 1 | No | 0 ~ 255 |
short | 2 | Yes | -32768 ~ 32767 |
ushort | 2 | No | 0 ~ 65535 |
int | 4 | Yes | -2,147,483,648 ~ 2,147,483,647 |
uint | 4 | No | 0 ~ 4,294,967,295 |
long | 8 | Yes | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
ulong | 8 | No | 0 ~ 18,446,744,073,709,551,615 |
符号なし8バイト「ulong」になると、日本語で表記した場合、1844京(1兆の1000倍が1京)という大変大きな数値を扱うことができます。
浮動小数点の組み込み型
小数が扱える組み込み型は以下の通りです。
type | byte | おおよそ範囲 | 有効桁数 |
---|---|---|---|
float | 4 | -3.4 × 1038 ~ +3.4 × 1038 まで *1 | 7桁 |
double | 8 | ±5.0 × 10^−324 ~ ±1.7 × 10308 *2 | 15-16桁 |
有効桁を超えた計算を行うと計算結果が不正確になる可能性があるので、扱いたい数値がどの程度か意識する必要があ(るときがあ)ります。
その他の組み込み型
整数、小数以外の情報を表す型は以下の通りです。
type | byte | Signed | 範囲 |
---|---|---|---|
bool | 存在しない | 存在しない | true / false |
char | 2 | No | U+0000 ~ U+FFFF (0 ~ FFFFと同じ) |
string | 存在しない | 存在しない | 存在しない |
object | 存在しない | 存在しない | 存在しない |
C#のbool型はint等の型と互換がありません。代入できないので0がfalseという扱いも存在しません。明示的にキャストしても代入不可能です。
// boolは数値と互換性が無い bool a = false; int b = (int)a; // CS0030 型 'bool' を 'int' に変換できません
「charは2バイト」でC#では「1文字」を扱うための変数で他の整数とは区別されます。2バイトの整数はshort/ushortがあるので純粋に数値を扱うときはそちらを使用しましょう。
但し、整数と互換があるためキャストすれば数字でも代入できます。
// charはキャストすれば char a = (char)0; // 0はintだけどキャストすれば代入可能
stringは特別で文字列を表します。値型だけど初期値がnullなのが特徴です。
object型は全ての型と互換があります。(全ての型が継承する基底クラスのため)従って、どのような値もobjectに代入することができます。
double d = 0.0 object a = d; // どんな型でも代入できる
値型はコピーとして渡される
値型はメソッドの引数などで渡すと値のコピーとして渡されます。以下例のように引数で値型を渡し、メソッド内で値を変更しても呼び出し元には反映されません。
public static void Main() { int a = 0; Add(a); Console.WriteLine(a); // 【出力】 // > 0 // ★★★値は変わらない } public static void Add(int a) { a = a + 10; }
メソッド内の変更を共有したい場合refキーワードを以下のように使用します。
public static void Main() { int a = 0; Add(ref a); // ref を付けて呼び出す Console.WriteLine(a); // 【出力】 // > 10 // ★★★値が変わる } public static void Add(ref int a) // refキーワード追加 { a = a + 10; }
値型のNull許容型
値型は「Null許容型」というnullが代入できる型として宣言することができます。
int? a = null;
どんな時に使用するかというと、例えば以下のように、初期値はnullで値が未設定の場合と、何か設定済みで数字が入っている場合を区別する事ができるようになります。(ただし扱いが難しい{人によって認識が違う可能性がある}ため使用する場合扱いに注意が必要です。
主にDBの整数フィールドから取り出した内容がnullのだった場合、に使用できます。
int? a = null; if(a == null) { // 何かの処理 }