基本的なデータ型と対応する各言語の型
以下の表は、.NETにおける基本的なデータ型と、それに対応する各言語の型をまとめたものです。
.NETでは、基本的なデータ型として表中にあるような型が用意されています。 このうちいくつかの型は、組み込み型(言語のプリミティブ型)としても用意されていて、それに対応する型はどちらも同じ型を表します。 例えば、C#のint
とVB.NETのInteger
は、.NET上においてはともにSystem.Int32
を表します。
以下の表においてプリミティブ = yes となっている型は、型が.NETにおいてプリミティブ型とされている(Type.IsPrimitiveがtrueとなる)ことを表します。 言語の組み込み型という意味でのプリミティブ型とは異なります。 すべての型はプリミティブ型、参照型、もしくはそれらの組み合わせからなる複合型のいずれかに分類できます。 逆に言えば、プリミティブ型は、それ以上他の型に分解できない型を表すことになります。
また、CLS準拠 = yes となっているものは、型が共通言語仕様(CLS)に準拠することを表します。
共通言語仕様(CLS)については言語間の相互運用性と共通言語仕様 (CLS)で詳しく解説しています。
.NETの型 | 種類 | プリミティブ | 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.Half | 半精度浮動小数点数 | no | yes | - | - | IEEE 754準拠・binary16形式の浮動小数点数 (.NET 5より登場。 内部的にはUInt16を使って実装されている。 C# 9.0/VB16時点では対応する言語の組み込み型は存在しない。) |
|
System.Single | 単精度浮動小数点数 | yes | yes |
float
|
Single
|
IEEE 754準拠・binary32形式の浮動小数点数 | ||
System.Double | 倍精度浮動小数点数 | yes | yes |
double
|
Double
|
IEEE 754準拠・binary64形式の浮動小数点数 | ||
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 | (C# 3.0以降のint? , bool? など) |
(VB9.0以降のInteger? , Boolean? など) |
|||
.NETの型 | 種類 | プリミティブ | CLS準拠 | C# | VB.NET | 備考 | ||
対応する組み込み型 |
型のサイズ・精度と値域
それぞれの型のサイズと、扱える値の精度・値域をまとめると次の表のようになります。
型 | 最小値 | 最大値 | 10進数表記での最大桁数 (符号を除く) |
サイズ | |
---|---|---|---|---|---|
C# | VB | ||||
System.SByte | -128 | +127 | 3 | 8ビット (1バイト) | |
sbyte
|
SByte
|
||||
System.Int16 | -32,768 | +32,767 | 5 | 16ビット (2バイト) | |
short
|
Short
|
||||
System.Int32 | -2,147,483,648 | +2,147,483,647 | 10 | 32ビット (4バイト) | |
int
|
Integer
|
||||
System.Int64 | -9,223,372,036,854,775,808 | +9,223,372,036,854,775,807 | 19 | 64ビット (8バイト) | |
long
|
Long
|
||||
System.Byte | 0 | +255 | 3 | 8ビット (1バイト) | |
byte
|
Byte
|
||||
System.UInt16 | 0 | +65,535 | 5 | 16ビット (2バイト) | |
ushort
|
UShort
|
||||
System.UInt32 | 0 | +4,294,967,295 | 10 | 32ビット (4バイト) | |
uint
|
UInteger
|
||||
System.UInt64 | 0 | +18,446,744,073,709,551,615 | 20 | 64ビット (8バイト) | |
ulong
|
ULong
|
||||
System.IntPtr | Int32もしくはInt64と同じ | プラットフォームによって変わり、32ビットマシンなら32ビット(Int32相当)、64ビットマシンなら64ビット(Int64相当)となる | |||
System.UIntPtr | UInt32もしくはUInt64と同じ | ||||
System.Numerics.BigInteger | (サイズは格納される値の大きさに応じて拡張される) |
型 | 最大値・最小値 | 10進換算桁数/有効桁数 | サイズ | |
---|---|---|---|---|
C# | VB | |||
System.Half | およそ±6.0×10-8 ~ ±6.6×104 (最小±5.9604645×10-8 〜 最大±6.5504×104) |
3.31 | 16ビット (2バイト) | |
System.Single | およそ±1.4×10-45 ~ ±3.4×1038 (最小±1.401298×10-45 〜 最大±3.4028235×1038) |
7.22 | 32ビット (4バイト) | |
float
|
Single
|
|||
System.Double | およそ±5.0×10-324 ~ ±1.8×10308 (最小±4.94065645841246544×10-324 ~ 最大±1.79769313486231570×10308) |
15.95 | 64ビット (8バイト) | |
double
|
Double
|
|||
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バイト) | |
decimal
|
Decimal
|
|||
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を使ってバイト配列へ/から変換することもできません。 DateTime/DateTimeOffsetでは64ビットのバイナリ表現あるいはUNIX時間等の別のフォーマットに変換するメソッドが用意されているため、それらのメソッドを使うことができます。 詳しくは日付・時刻の型と操作 §.他のフォーマットとの相互変換を参照してください。
Booleanはマネージドコード上では1バイトとして定義されていますが、アンマネージAPI呼び出しに際しては4バイトとして扱われることがあります。 この点について詳しくは構造体のサイズ §.Marshal.SizeOfとsizeofの違いを参照してください。
Int32, Int64と32ビット・64ビット環境
.NETでは、Int32
(int
/Integer
)およびInt64
(long
/Long
)は、実行環境が32ビットか64ビットかどうかに関わらず、常に32ビット・64ビットのサイズとなります。 これはInt16
やUInt32
など他の整数型も同様です。
一方で、IntPtr
およびUIntPtr
は実行環境が32ビットならサイズが32ビット、実行環境が64ビットならサイズが64ビットに変わります。 より具体的には、32ビット版の.NETで動作している場合は32ビット、64ビット版の場合は64ビットとなります。 そのため、プラットフォームに依存しない固定長のフィールド等にはInt32
・Int64
を使用し、プラットフォームAPI呼び出し等で使用するハンドルやポインタ型にはIntPtr
・UIntPtr
を使用するといった使い分けをします。
IntPtr.Sizeプロパティを参照するとIntPtr
のバイト数を取得することができ、これによりプラットフォームが32ビットか64ビットかを判断することができます。 32ビットならSizeプロパティの値が4、64ビットなら8となります。
この他、現在のプロセスが32ビットと64ビットのどちらで動作しているか、OSが32ビット・64ビットのどちらかといったことを調べる方法についてはランタイム・システム・プラットフォームの情報 §.32ビット環境・64ビット環境で解説しています。
なお、ハンドルを扱う場合は、可能ならIntPtrではなくSafeHandle等を使うことが推奨されます。
型のサイズの取得
Marshal.SizeOfメソッドを使うことによって型のサイズを取得することができます。 詳しくは構造体のサイズを参照してください。
型のデフォルト値
それぞれの型のデフォルト値をまとめると次の表のようになります。
型のデフォルト値は、ローカル変数やフィールドに初期値を指定しなかった場合の値や、配列であれば各要素の初期値、Array.Clearメソッドで配列内を初期化した時の値などと同じ値となります。 このほか、defaultキーワード・Nothingキーワードで取得されるデフォルト値がこの値となります。
型 | デフォルト値 | ||
---|---|---|---|
数値型 | 整数型 |
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 | ||
型 | デフォルト値 |
デフォルト値の取得
C#では、defaultキーワードを使うことで値型・参照型問わず、任意の型でそのデフォルト値を取得することができます。
VBではこのようなキーワードは用意されていませんが、代わりにNothingキーワードを使うことができます。 Nothing
は参照型のほか、値型にも使うことができ、値型の場合は対象の型のデフォルト値を表すものとなります。
default
キーワード、デフォルト値としてのNothing
キーワードは、ジェネリックなクラス・メソッドで特に役に立つものです。 このキーワードを用いると、デフォルト値を返したり設定したい場合、数値型なら0
、参照型ならnull
/Nothing
といった型による場合分けをする必要が無くなります。
次の例は、Array.Clearメソッドと同様のメソッドを実装する例です。 この例では、配列をクリアする処理をジェネリックメソッドとして実装しています。 配列内の各要素に対してdefault
/Nothing
で型に応じたデフォルト値を代入することにより、配列をクリアしています。
定数
基本データ型には、最大値・最小値などの定数を表す静的フィールドが用意されています。
最大値・最小値
Int32・Double・DateTime等の基本型では、MinValue・MaxValueフィールドを参照することにより、各型で扱える最小値・最大値を取得することができます。
これらのフィールドは、.NETの型名・言語組み込みの型名のどちらでも参照できます。 当然、どちらでも値は同じです。
Int32・Int64等は実行環境が32ビットか64ビットかどうかに関わらず、常に32ビット・64ビットであるため、実行環境によってMaxValue・MinValueフィールドの値が変わるということはありません。 (§.Int32, Int64と32ビット・64ビット環境)
MaxValue・MinValueフィールドは、数直線上において0から最も離れた(無限大に最も近い)正または負の値を返します。 浮動小数点数型に対して、数直線上において0に最も近い正の値を取得したい場合はEpsilonフィールドを参照します。
無限大・非数
浮動小数点数型での演算では、ゼロによる除算やゼロ同士の除算、Mathクラスでの演算などにより、結果が無限大や非数になる場合があります。 また、場合によっては値として無限大や非数を代入する必要が生じることもあります。
Half/Single/Doubleには、これらの特殊な値を表す定数が以下の静的フィールドとして用意されています。
- PositiveInfinityフィールド
- 正の無限大を表す定数。 正の数をゼロで除算した場合や、演算結果がMaxValueより大きくなる場合にこの値となります。
- NegativeInfinityフィールド
- 負の無限大を表す定数。 負の数をゼロで除算した場合や、演算結果がMinValueより小さくなる場合にこの値となります。
- NaNフィールド
- 非数を表す定数。 ゼロ同士の除算や、非数との演算など、演算の結果が未定義となる場合にこの値となります。
.NETでは例外DivideByZeroExceptionが定義されていますが、上記の例にもあるように、Single/Doubleでのゼロ除算では例外はスローされません。 一方、Decimalでゼロ除算となる場合はDivideByZeroExceptionがスローされます。
Half/Single/Doubleには、値が非数や無限大かどうかを調べる以下のメソッドが用意されています。
- IsInfinityメソッド
- 値が正または負の無限大かどうか調べる。
値がPositiveInfinityまたはNegativeInfinityとなる場合はtrue、そうでなければfalseが返される。 - IsPositiveInfinityメソッド
- 値が正の無限大かどうか調べる。
値がPositiveInfinityとなる場合はtrue、そうでなければfalseが返される。 - IsNegativeInfinityメソッド
- 値が負の無限大かどうか調べる。
値がNegativeInfinityとなる場合はtrue、そうでなければfalseが返される。 - IsNaNメソッド
- 値が非数かどうか調べる。
値がNaNとなる場合はtrue、そうでなければfalseが返される。
Decimalでは無限大・非数を扱うことはできません。 定数値および定数同士の計算結果が0除算となる場合、コンパイル時エラーとなります。 また、実行時に0除算となる場合は例外DivideByZeroExceptionがスローされます。
0に最も近い正数
Epsilonフィールドを参照すると、Half/Single/Doubleで表現できるゼロではない最小の正の数(数直線上で0に最も近い正の数)を取得することができます。
最小の負数(数直線上で0から最も離れた負の数)を取得するには、MinValueフィールドを参照します。
ヌル値
IntPtrとUIntPtrには、値が0
のポインタを表すフィールドZeroが用意されています。 このフィールドは、プラットフォームAPIの呼び出し時に、ポインタ引数の値としてNULL
/nullptr
を指定したい場合などに使用することができます。 なお、コンストラクタに0
を指定することでも同じ値が得られます。
現在の日時・日付
DateTimeとDateTimeOffsetには、現在の日時を表すNowプロパティとTodayプロパティが用意されています。 Nowプロパティは時刻を含めた値であるのに対し、Todayプロパティは日付のみの値となります(時刻の部分は常に0時0分0秒)。 また、Nowプロパティではローカル時刻を取得できますが、UtcNowプロパティを参照するとUTCでの時刻を取得することができます。
なお、このプロパティで取得できる日時はシステム時計の分解能に依存するため、短時間に連続して取得すると同じ値が返ってくる場合があります。
DateTime/DateTimeOffsetについてより詳しくは日付・時刻の型と操作を参照してください。
型変換・丸め
型の変換や実数型の丸めには、各言語のキャスト構文や、Parse/TryParse/ToStringなどのメソッド、Convertクラスを用いることができます。 詳しくは基本型の型変換や数学関数 §.実数の丸め・端数処理 (Truncate, Ceiling, Floor, Round)で解説しています。