§1 基本的なデータ型と対応する各言語の型

以下の表は、.NET Frameworkのデータ型と対応する各言語の型をまとめたものです。

.NET Frameworkでは基本的なデータ型として表中にあるような型が用意されています。 これらの型のほとんどは、各言語の組み込み型(言語のプリミティブ型)に対応する型となっています。 例えば、C#のintとVB.NETのIntegerは、.NET Framework上においてはともにSystem.Int32を表します。

以下の表においてプリミティブ = yes となっているものは、型が.NET Frameworkにおいてプリミティブ型とされている(Type.IsPrimitiveがtrueとなる)ことを表します。 言語の組み込み型という意味でのプリミティブ型とは異なります。 すべての型はプリミティブ型、参照型、もしくはそれらの組み合わせからなる複合型のいずれかに分類できます。

また、CLS準拠 = yes となっているものは、型が共通言語仕様(CLS)に準拠することを表します。

共通言語仕様(CLS)については言語間の相互運用性と共通言語仕様 (CLS)で詳しく解説しています。

.NET Frameworkの基本的なデータ型と対応する言語の型
.NET Frameworkの型 種類 プリミティブ CLS準拠 対応する組み込み型 備考
C# VB.NET
数値型 整数型 System.SByte 8ビット 符号付き整数 yes no sbyte SByte
System.Int16 16ビット 符号付き整数 yes yes short Short
System.Int32 32ビット 符号付き整数 yes yes int Integer
System.Int64 64ビット 符号付き整数 yes yes long Long
System.Byte 8ビット 符号なし整数 yes yes byte Byte
System.UInt16 16ビット 符号なし整数 yes no ushort UShort
System.UInt32 32ビット 符号なし整数 yes no uint UInteger
System.UInt64 64ビット 符号なし整数 yes no ulong ULong
実数型 System.Single 単精度浮動小数点数 yes yes float Single
System.Double 倍精度浮動小数点数 yes yes double Double
System.Decimal 10進実数 no yes decimal Decimal
その他の数値型 System.IntPtr ポインタ (符号付き) yes yes (void*, int*など) - ポインタやハンドルを表す値を格納するための型
ポインタを直接サポートしていない言語との相互運用などに使用される
System.UIntPtr ポインタ (符号なし) yes no (void*, int*など) - 同上
System.Numerics.BigInteger 符号付き整数 no yes - - (.NET Framework 4から、多倍長整数型で解説)
System.Numerics.Complex 複素数 no yes - - (.NET Framework 4から、複素数型で解説)
文字と文字列の型 System.Char 文字 yes yes char Char UTF-16で符号化したUnicode文字列の符号単位を格納
ほとんどの場合、Unicode文字1文字が格納される
System.String 文字列 (参照型) yes string String UTF-16で符号化したUnicode文字列を格納
日付と時刻の型
System.DateTime 日時 no yes - Date
System.DateTimeOffset 日時とオフセット no yes - - DateTimeに世界協定時刻(UTC)からの時刻の差の値を保持するメンバを加えたもの
System.TimeSpan 時間間隔 no yes - -
その他の型 System.Object オブジェクト (参照型) yes object Object
System.Boolean 真偽値 yes yes bool Boolean
System.Nullable ヌル許容型 no yes (int?, bool?など) (VB 2008以降のInteger?, Boolean?など)
.NET Frameworkの型 種類 プリミティブ CLS準拠 C# VB.NET 備考
対応する組み込み型


§2 型のサイズ・精度と値域

それぞれの型のサイズと、扱える値の精度・値域をまとめると次の表のようになります。

整数型のサイズと値域
最小値 最大値 10進数表記での最大桁数
(符号を除く)
サイズ
System.SByte
(sbyte, SByte)
-128 +127 3 8ビット (1バイト)
System.Int16
(short, Short)
-32,768 +32,767 5 16ビット (2バイト)
System.Int32
(int, Integer)
-2,147,483,648 +2,147,483,647 10 32ビット (4バイト)
System.Int64
(long, Long)
-9,223,372,036,854,775,808 +9,223,372,036,854,775,807 19 64ビット (8バイト)
System.Byte
(byte, Byte)
0 +255 3 8ビット (1バイト)
System.UInt16
(ushort, UShort)
0 +65,535 5 16ビット (2バイト)
System.UInt32
(uint, UInteger)
0 +4,294,967,295 10 32ビット (4バイト)
System.UInt64
(ulong, ULong)
0 +18,446,744,073,709,551,615 20 64ビット (8バイト)
System.IntPtr Int32もしくはInt64と同じ プラットフォームによって変わり、32ビットマシンなら32ビット(Int32相当)、64ビットマシンなら64ビット(Int64相当)となる
System.UIntPtr UInt32もしくはUInt64と同じ 同上
System.Numerics.BigInteger (サイズは格納される値の大きさに応じて拡張される)
実数型のサイズ・精度と値域
最大値・最小値 有効桁数 サイズ
System.Single
(float, Single)
およそ±1.4×10−45 ~ ±3.4 × 1038

(最小±1.401298×10−45 〜 最大±3.4028235×1038)
7 32ビット (4バイト)
System.Double
(double, Double)
およそ±5.0×10−324 ~ ±1.8×10308

(最小±4.94065645841246544×10−324 ~ 最大±1.79769313486231570×10308)
15~16 64ビット (8バイト)
System.Decimal およそ±1.0×10−28 ~ ±7.9×1028

(最小±0.0000000000000000000000000001 ~ 最大±79,228,162,514,264,337,593,543,950,335)
28~29 128ビット (16バイト)
System.Numerics.Complex 実数部・虚数部それぞれのサイズと精度はSystem.Doubleと同じ
日付と時刻の型のサイズ・精度と値域
最大値・最小値 精度 サイズ
System.DateTime 最小 0001年1月1日 00:00:00 ~ 最大 9999年12月31日 23:59:59 100ナノ秒単位 -
System.DateTimeOffset 最小 0001年1月1日 00:00:00 (+00:00) ~ 最大 9999年12月31日 23:59:59 (+00:00)
オフセット値は最小-14時間 ~ 最大+14時間
100ナノ秒単位 -
System.TimeSpan 最小 -10675199日02時間48分05.4775808秒 ~ 最大 10675199日02時間48分05.4775807秒
(Int64の最大値・最小値×100ナノ秒)
100ナノ秒単位 64ビット (8バイト)

DateTime, DateTimeOffsetはサイズが定義されません。 Marshal.SizeOfメソッドの呼び出しは失敗します。 また、BitConverterを使ってバイト配列へ/から変換することもできません。

§2.1 Int32, Int64と32ビット・64ビット環境

.NET Frameworkでは、Int32(int/Integer)およびInt64(long/Long)は、実行環境が32ビットか64ビットかどうかに関わらず、常に32ビット・64ビットのサイズとなります。 これはInt16やUInt32など他の整数型も同様です。 一方で、IntPtrおよびUIntPtrは実行環境が32ビットならサイズが32ビット、実行環境が64ビットならサイズが64ビットに変わります。 より具体的には、32ビット版の.NET Framework上で動作している場合は32ビット、64ビット版の場合は64ビットとなります。 そのため、プラットフォームに依存しない固定長のフィールド等にはInt32・Int64を使用し、プラットフォームAPI呼び出し等で使用するハンドルやポインタ型にはIntPtr・UIntPtrを使用するといった使い分けをします。

IntPtr.Sizeプロパティが返すIntPtrのバイト数を調べることにより、プラットフォームが32ビットか64ビットかを判断することが出来ます。 32ビットならSizeプロパティの値が4、64ビットなら8となります。

using System;

class Sample {
  static void Main()
  {
    if (IntPtr.Size == 4)
      Console.WriteLine("32bit");
    else if (IntPtr.Size == 8)
      Console.WriteLine("64bit");
    else
      Console.WriteLine("?");
  }
}

この他、現在のプロセスが32ビットと64ビットのどちらで動作しているか、OSが32ビット・64ビットのどちらかといったことを調べる方法についてはランタイム・システム・プラットフォームの情報 §.32ビット環境・64ビット環境で解説しています。

なお、ハンドルを扱う場合は、可能ならIntPtrではなくSafeHandle等を使うことが推奨されます。

§2.2 型のサイズの取得

Marshal.SizeOfメソッドを使うことによって型のサイズを取得することができます。 詳しくは構造体のサイズを参照してください。

§3 型のデフォルト値

それぞれの型のデフォルト値をまとめると次の表のようになります。

型とデフォルト値
デフォルト値
数値型 整数型 System.SByte
(sbyte, SByte)
0
System.Int16
(short, Short)
0
System.Int32
(int, Integer)
0
System.Int64
(long, Long)
0
System.Byte
(byte, Byte)
0
System.UInt16
(ushort, UShort)
0
System.UInt32
(uint, UInteger)
0
System.UInt64
(ulong, ULong)
0
実数型 System.Single
(float, Single)
0
System.Double
(double, Double)
0
System.Decimal
(decimal, Decimal)
0
その他の数値型 System.IntPtr 0
(IntPtr.Zero)
System.UIntPtr 0
(UIntPtr.Zero)
System.Numerics.BigInteger 0
(BigInteger.Zero)
System.Numerics.Complex 0
(Complex.Zero)
文字と文字列の型 System.Char
(char, Char)
0
(Char.MinValue, '\x0', U+0000)
System.String
(string, String)
null/Nothing
日付と時刻の型 System.DateTime 0001/01/01 0:00:00
(DateTime.MinValue)
System.DateTimeOffset 0001/01/01 0:00:00 +00:00
(DateTimeOffset.MinValue)
System.TimeSpan 00:00:00
(TimeSpan.Zero)
その他の型 System.Objectおよびすべての参照型
(object, Object)
null/Nothing
System.Boolean
(bool, Boolean)
false/False
System.Nullableなど
(int?, Integer?など)
null/Nothing
デフォルト値

これらのデフォルト値は、ローカル変数やフィールドに初期値を指定しなかった場合の値や、配列なら各要素の初期値、Array.Clearメソッドで配列内を初期化した時の値などと同じ値なります。

§3.1 デフォルト値の取得

C#では、defaultキーワードを使うことで値型・参照型問わず、任意の型でそのデフォルト値を取得することが出来ます。 VBではこのようなキーワードは用意されていませんが、代わりにNothingを使うことが出来ます。 Nothingは参照型のほか、値型にも使うことが出来、値型の場合はデフォルト値を表すものとなります。

using System;

class Sample {
  static void Main()
  {
    int i = default(int); // intのデフォルト値
    bool b = default(bool); // boolのデフォルト値
    string s = default(string); // stringのデフォルト値
    DateTime dtm = default(DateTime); // DateTimeのデフォルト値
    Point p = default(Point); // 独自に定義した構造体Pointのデフォルト値

    Console.WriteLine("default(int) = {0}", i);
    Console.WriteLine("default(bool) = {0}", b);
    Console.WriteLine("default(string) = {0}, null? = {1}", s, s == null);
    Console.WriteLine("default(DateTime) = {0}", dtm);
    Console.WriteLine("default(Point) = {0}", p);
  }
}

struct Point {
  public Point(int x, int y)
  {
    this.x = x;
    this.y = y;
  }

  public override string ToString()
  {
    return string.Format("({0}, {1})", x, y);
  }

  private int x, y;
}
実行結果
default(int) = 0
default(bool) = False
default(string) = , null? = True
default(DateTime) = 0001/01/01 0:00:00
default(Point) = (0, 0)

これはジェネリックなクラス・メソッドで特に役に立つもので、デフォルト値を返したい場合に数値型なら0、参照型ならnullといった面倒な場合分けをする必要が無くなります。 次の例は、Array.Clearメソッドと同様に配列内の各要素を初期化するジェネリックメソッドの例です。 default/Nothingで型に応じた初期値を代入することで各要素の初期化を行っています。

using System;

class Sample {
  // 配列の内容をクリアする
  static void Clear<T>(T[] arr)
  {
    for (int i = 0; i < arr.Length; i++) {
      arr[i] = default(T); // 型Tのデフォルト値を格納する
    }
  }

  static void Main()
  {
    int[] intArray = new int[10];
    string[] strArray = new string[10];

    Clear(intArray);
    Clear(strArray);
  }
}

§4 定数

基本データ型には、最大値・最小値などの定数を表す静的フィールドが用意されています。

§4.1 最大値・最小値

MaxValue・MinValueフィールドを参照することで、各型の最大値・最小値を取得することができます。 これらのフィールドは、.NET Frameworkの型名・言語の型名のどちらでも参照できます(当然、値は同じです)。 また、Int32・Int64等は実行環境が32ビットか64ビットかどうかに関わらず、常に32ビット・64ビットであるため、実行環境によってMaxValue・MinValueフィールドの値が変わるということはありません。

using System;

class Sample {
  static void Main()
  {
    // int型/Int32の最小値・最大値
    Console.WriteLine("int.MinValue   = {0}, int.MaxValue   = {1}", int.MinValue, int.MaxValue);
    Console.WriteLine("Int32.MinValue = {0}, Int32.MaxValue = {1}", Int32.MinValue, Int32.MaxValue);
    Console.WriteLine();

    // uint型の最小値・最大値
    Console.WriteLine("uint.MinValue = {0}, uint.MaxValue = {1}", uint.MinValue, uint.MaxValue);

    // double型の最小値・最大値
    Console.WriteLine("double.MinValue = {0}, double.MaxValue = {1}", double.MinValue, double.MaxValue);

    // DateTimeの最小値・最大値
    Console.WriteLine("DateTime.MinValue = {0}, DateTime.MaxValue = {1}", DateTime.MinValue, DateTime.MaxValue);
  }
}
実行結果
int.MinValue   = -2147483648, int.MaxValue   = 2147483647
Int32.MinValue = -2147483648, Int32.MaxValue = 2147483647

uint.MinValue = 0, uint.MaxValue = 4294967295
double.MinValue = -1.79769313486232E+308, double.MaxValue = 1.79769313486232E+308
DateTime.MinValue = 0001/01/01 0:00:00, DateTime.MaxValue = 9999/12/31 23:59:59

§4.2 無限大・非数

Double等での演算では、ゼロによる除算やゼロ同士の除算などにより、結果が無限大や非数になる場合があります。 SingleDoubleには、これらの特殊な値を表す定数が静的フィールドとして用意されています。

PositiveInfinityフィールド
正の無限大を表す定数。 正の数をゼロで除算した場合や、演算結果がMaxValueより大きくなる場合にこの値となります。
NegativeInfinityフィールド
負の無限大を表す定数。 負の数をゼロで除算した場合や、演算結果がMinValueより小さくなる場合にこの値となります。
NaNフィールド
非数を表す定数。 ゼロ同士の除算や、非数との演算など、演算の結果が未定義となる場合にこの値となります。
using System;

class Sample {
  static void Main()
  {
    double zero = 0.0;
    double plus = +1.0;
    double minus = -1.0;

    Console.WriteLine("{0} {1}", plus / zero, double.PositiveInfinity);
    Console.WriteLine("{0} {1}", minus / zero, double.NegativeInfinity);
    Console.WriteLine("{0} {1}", zero / zero, double.NaN);
  }
}
実行結果
+∞ +∞
-∞ -∞
NaN (非数値) NaN (非数値)

SingleDoubleには、値が非数や無限大かどうかを調べるメソッドも用意されています。

IsInfinityメソッド
値が正または負の無限大かどうか調べる。
値がPositiveInfinityまたはNegativeInfinityとなる場合はtrue、そうでなければfalseが返される。
IsPositiveInfinityメソッド
値が正の無限大かどうか調べる。
値がPositiveInfinityとなる場合はtrue、そうでなければfalseが返される。
IsNegativeInfinityメソッド
値が負の無限大かどうか調べる。
値がNegativeInfinityとなる場合はtrue、そうでなければfalseが返される。
IsNaNメソッド
値が非数かどうか調べる。
値がNaNとなる場合はtrue、そうでなければfalseが返される。
using System;

class Sample {
  static void Main()
  {
    double d1 = +1.0 / 0.0;

    Console.WriteLine(d1);
    Console.WriteLine("IsInfinity={0}", double.IsInfinity(d1));
    Console.WriteLine("IsPositiveInfinity={0}", double.IsPositiveInfinity(d1));
    Console.WriteLine("IsNegativeInfinity={0}", double.IsNegativeInfinity(d1));
    Console.WriteLine("IsNaN={0}", double.IsNaN(d1));
    Console.WriteLine();

    double d2 = -1.0 / 0.0;

    Console.WriteLine(d2);
    Console.WriteLine("IsInfinity={0}", double.IsInfinity(d2));
    Console.WriteLine("IsPositiveInfinity={0}", double.IsPositiveInfinity(d2));
    Console.WriteLine("IsNegativeInfinity={0}", double.IsNegativeInfinity(d2));
    Console.WriteLine("IsNaN={0}", double.IsNaN(d2));
    Console.WriteLine();

    double d3 =  0.0 / 0.0;

    Console.WriteLine(d3);
    Console.WriteLine("IsInfinity={0}", double.IsInfinity(d3));
    Console.WriteLine("IsPositiveInfinity={0}", double.IsPositiveInfinity(d3));
    Console.WriteLine("IsNegativeInfinity={0}", double.IsNegativeInfinity(d3));
    Console.WriteLine("IsNaN={0}", double.IsNaN(d3));
    Console.WriteLine();
  }
}
実行結果
+∞
IsInfinity=True
IsPositiveInfinity=True
IsNegativeInfinity=False
IsNaN=False

-∞
IsInfinity=True
IsPositiveInfinity=False
IsNegativeInfinity=True
IsNaN=False

NaN (非数値)
IsInfinity=False
IsPositiveInfinity=False
IsNegativeInfinity=False
IsNaN=True

このほか、SingleおよびDoubleで表現できる(ゼロでない)最小の数を表すEpsilonフィールドも用意されています。

using System;

class Sample {
  static void Main()
  {
    Console.WriteLine("{0:r}", float.Epsilon);
    Console.WriteLine("{0:r}", double.Epsilon);
  }
}
実行結果
1.401298E-45
4.94065645841247E-324

§4.3 ヌル値

IntPtrUIntPtrには、値が0のポインタを表すフィールドZeroが用意されています。 プラットフォームAPIの呼び出し時に、ポインタ引数の値としてNULLを指定したい場合などに使用することができます。 これはコンストラクタに0を指定した場合と同じ値です。

using System;

class Sample {
  static void Main()
  {
    Console.WriteLine("{0} {1}", IntPtr.Zero, new IntPtr(0));
    Console.WriteLine("{0} {1}", UIntPtr.Zero, new UIntPtr(0));
  }
}
実行結果
0 0
0 0

§4.4 現在の日時・日付

DateTimeDateTimeOffsetには、現在の日時を表すNowプロパティTodayプロパティが用意されています。 Nowプロパティは時刻を含めた値であるのに対し、Todayプロパティは日付のみの値となります(時刻の部分は常に0時0分0秒)。 また、Nowプロパティではローカル時刻を取得できますが、UtcNowプロパティを参照するとUTCでの時刻を取得することができます。

using System;

class Sample {
  static void Main()
  {
    Console.WriteLine("Today:  {0:o}", DateTime.Today);
    Console.WriteLine("Now:    {0:o}", DateTime.Now);
    Console.WriteLine("UtcNow: {0:o}", DateTime.UtcNow);
  }
}
実行結果
Today:  2011-06-20T00:00:00.0000000+09:00
Now:    2011-06-20T23:01:05.0298480+09:00
UtcNow: 2011-06-20T14:01:05.0299450Z

なお、このプロパティで取得できる日時はシステム時計の分解能に依存するため、短時間に連続して取得すると同じ値が返ってくる場合があります。

§5 型変換・丸め

型の変換や実数型の丸めには、各言語のキャスト構文や、Parse/TryParse/ToStringなどのメソッド、Convertクラスを用いることができます。 詳しくは基本型の型変換数学関数 §.実数の丸め・端数処理 (Truncate, Ceiling, Floor, Round)で解説しています。