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

以下の表は、.NETにおける基本的なデータ型と、それに対応する各言語の型をまとめたものです。

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

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

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

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

.NETの基本的なデータ型と対応する言語の型
.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ビットのサイズとなります。 これはInt16UInt32など他の整数型も同様です。

一方で、IntPtrおよびUIntPtr実行環境が32ビットならサイズが32ビット、実行環境が64ビットならサイズが64ビットに変わります。 より具体的には、32ビット版の.NETで動作している場合は32ビット、64ビット版の場合は64ビットとなります。 そのため、プラットフォームに依存しない固定長のフィールド等にはInt32Int64を使用し、プラットフォームAPI呼び出し等で使用するハンドルやポインタ型にはIntPtrUIntPtrを使用するといった使い分けをします。

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("?");
  }
}
Imports System

Class Sample
  Shared Sub Main()
    If IntPtr.Size = 4 Then
      Console.WriteLine("32bit")
    Else If IntPtr.Size = 8 Then
      Console.WriteLine("64bit")
    Else
      Console.WriteLine("?")
    End If
  End Sub
End Class

この他、現在のプロセスが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キーワードで型のデフォルト値を取得する
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)
Nothingキーワードで型のデフォルト値を取得する
Imports System

Class Sample
  Shared Sub Main()
    Dim i As Integer = Nothing ' Integerのデフォルト値
    Dim b As Boolean = Nothing ' Booleanのデフォルト値
    Dim s As String = Nothing ' Stringのデフォルト値
    Dim dtm As Date = Nothing ' Dateのデフォルト値
    Dim p As Point = Nothing ' 独自に定義した構造体Pointのデフォルト値

    Console.WriteLine("default(Integer) = {0}", i)
    Console.WriteLine("default(Boolean) = {0}", b)
    Console.WriteLine("default(String) = {0}, Is Nothing? = {1}", s, s Is Nothing)
    Console.WriteLine("default(Date) = {0}", dtm)
    Console.WriteLine("default(Point) = {0}", p)
  End Sub
End Class

Structure Point
  Public Sub New(ByVal x As Integer, ByVal y As Integer)
    Me.x = x
    Me.y = y
  End Sub

  Public Overrides Function ToString() As String
    Return String.Format("({0}, {1})", x, y)
  End Function

  Private x, y As Integer
End Structure
実行結果
default(Integer) = 0
default(Boolean) = False
default(String) = , Is Nothing? = True
default(Date) = 0001/01/01 0:00:00
default(Point) = (0, 0)

defaultキーワード、デフォルト値としてのNothingキーワードは、ジェネリックなクラス・メソッドで特に役に立つものです。 このキーワードを用いると、デフォルト値を返したり設定したい場合、数値型なら0、参照型ならnull/Nothingといった型による場合分けをする必要が無くなります。

次の例は、Array.Clearメソッドと同様のメソッドを実装する例です。 この例では、配列をクリアする処理をジェネリックメソッドとして実装しています。 配列内の各要素に対してdefault/Nothingで型に応じたデフォルト値を代入することにより、配列をクリアしています。

ジェネリックメソッドにおいて、defaultキーワードで型引数の型に応じたデフォルト値を取得する
using System;

class Sample {
  // 任意の型Tの配列の内容をクリアする
  static void Clear<T>(T[] arr)
  {
    for (int i = 0; i < arr.Length; i++) {
      arr[i] = default(T); // 型Tのデフォルト値を設定する
      arr[i] = default;    // 対象の型が明らかな場合は型指定を省略することもできる
    }
  }

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

    Clear(intArray);
    Clear(strArray);
  }
}
ジェネリックメソッドにおいて、Nothingキーワードで対象の型に応じたデフォルト値を取得する
Imports System

Class Sample
  ' 任意の型Tの配列の内容をクリアする
  Shared Sub Clear(Of T)(ByVal arr As T())
    For i As Integer = 0 To arr.Length - 1
      arr(i) = Nothing ' 型Tのデフォルト値を設定する
    Next
  End Sub

  Shared Sub Main()
    Dim intArray(9) As Integer
    Dim strArray(9) As String

    Clear(Of Integer)(intArray)
    Clear(Of String)(strArray)
  End Sub
End Class

定数

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

最大値・最小値

Int32・Double・DateTime等の基本型では、MinValue・MaxValueフィールドを参照することにより、各型で扱える最小値・最大値を取得することができます。

これらのフィールドは、.NETの型名・言語組み込みの型名のどちらでも参照できます。 当然、どちらでも値は同じです。

MinValue・MaxValueフィールドを参照して型の最小値・最大値を取得する
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
MinValue・MaxValueフィールドを参照して型の最小値・最大値を取得する
Imports System

Class Sample
  Shared Sub Main()
    ' Integer型/Int32の最小値・最大値
    Console.WriteLine("Integer.MinValue = {0}, Integer.MaxValue = {1}", Integer.MinValue, Integer.MaxValue)
    Console.WriteLine("Int32.MinValue   = {0}, Int32.MaxValue   = {1}", Int32.MinValue, Int32.MaxValue)
    Console.WriteLine()

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

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

    ' Date型の最小値・最大値
    Console.WriteLine("Date.MinValue = {0}, Date.MaxValue = {1}", Date.MinValue, Date.MaxValue)
  End Sub
End Class
実行結果
Integer.MinValue = -2147483648, Integer.MaxValue = 2147483647
Int32.MinValue   = -2147483648, Int32.MaxValue   = 2147483647

UInteger.MinValue = 0, UInteger.MaxValue = 4294967295
Double.MinValue = -1.79769313486232E+308, Double.MaxValue = 1.79769313486232E+308
Date.MinValue = 0001/01/01 0:00:00, Date.MaxValue = 9999/12/31 23:59:59

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フィールド
非数を表す定数。 ゼロ同士の除算や、非数との演算など、演算の結果が未定義となる場合にこの値となります。
PositiveInfinity/NegativeInfinity/NaNフィールドを参照して正負の無限大・非数を取得する
using System;

class Sample {
  static void Main()
  {
    const double zero = 0.0;
    const double plus = +1.0;
    const 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);
  }
}
PositiveInfinity/NegativeInfinity/NaNフィールドを参照して正負の無限大・非数を取得する
Imports System

Class Sample
  Shared Sub Main()
    Const zero As Double = 0.0
    Const plus As Double = +1.0
    Const minus As Double = -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)
  End Sub
End Class
実行結果
+∞ +∞
-∞ -∞
NaN (非数値) 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が返される。
IsInfinity/IsNaNメソッドで値が無限大かどうか・非数かどうかを調べる
using System;

class Sample {
  static void IsSpecialValue(double d)
  {
    // 値が無限大かどうか、非数かどうかを調べる
    Console.WriteLine("[Value: {0}]", d);
    Console.WriteLine("IsInfinity? {0}", double.IsInfinity(d));
    Console.WriteLine("IsPositiveInfinity? {0}", double.IsPositiveInfinity(d));
    Console.WriteLine("IsNegativeInfinity? {0}", double.IsNegativeInfinity(d));
    Console.WriteLine("IsNaN? {0}", double.IsNaN(d));
    Console.WriteLine();
  }

  static void Main()
  {
    double d0 =  0.0;
    double d1 = +1.0 / 0.0;
    double d2 = -1.0 / 0.0;
    double d3 =  0.0 / 0.0;

    IsSpecialValue(d0);
    IsSpecialValue(d1);
    IsSpecialValue(d2);
    IsSpecialValue(d3);
  }
}
IsInfinity/IsNaNメソッドで値が無限大かどうか・非数かどうかを調べる
Imports System

Class Sample
  Shared Sub IsSpecialValue(ByVal d As Double)
    ' 値が無限大かどうか、非数かどうかを調べる
    Console.WriteLine("[Value: {0}]", d)
    Console.WriteLine("IsInfinity? {0}", Double.IsInfinity(d))
    Console.WriteLine("IsPositiveInfinity? {0}", Double.IsPositiveInfinity(d))
    Console.WriteLine("IsNegativeInfinity? {0}", Double.IsNegativeInfinity(d))
    Console.WriteLine("IsNaN? {0}", Double.IsNaN(d))
    Console.WriteLine()
  End Sub

  Shared Sub Main()
    Dim d0 As Double = 0.0
    Dim d1 As Double = +1.0 / 0.0
    Dim d2 As Double = -1.0 / 0.0
    Dim d3 As Double =  0.0 / 0.0

    IsSpecialValue(d0)
    IsSpecialValue(d1)
    IsSpecialValue(d2)
    IsSpecialValue(d3)
  End Sub
End Class
実行結果
[Value: 0]
IsInfinity? False
IsPositiveInfinity? False
IsNegativeInfinity? False
IsNaN? False

[Value: ∞]
IsInfinity? True
IsPositiveInfinity? True
IsNegativeInfinity? False
IsNaN? False

[Value: -∞]
IsInfinity? True
IsPositiveInfinity? False
IsNegativeInfinity? True
IsNaN? False

[Value: NaN]
IsInfinity? False
IsPositiveInfinity? False
IsNegativeInfinity? False
IsNaN? True


Decimalでは無限大・非数を扱うことはできません。 定数値および定数同士の計算結果が0除算となる場合、コンパイル時エラーとなります。 また、実行時に0除算となる場合は例外DivideByZeroExceptionがスローされます。

Decimalにおけるゼロ除算の扱い
using System;

class Sample {
  static void Main()
  {
    const decimal zero = 0.0m;
    const decimal nonzero = 1.0m;
    decimal one = 1.0m;

    // 定数0による除算の場合、コンパイル時エラーとなる
    Console.WriteLine(nonzero / zero); // error CS0020: 定数 0 による除算です。

    // 実行時に0除算となる場合、例外DivideByZeroExceptionがスローされる
    Console.WriteLine(one / (one - 1.0m));
  }
}
Decimalにおけるゼロ除算の扱い
Imports System

Class Sample
  Shared Sub Main()
    Const zero As Decimal = 0.0D
    Const nonzero As Decimal = 1.0D
    Dim one As Decimal = 1.0D

    ' 定数0による除算の場合、コンパイル時エラーとなる
    Console.WriteLine(nonzero / zero) ' error BC30542: この式の評価中に 0 による除算が発生しました。

    ' 実行時に0除算となる場合、例外DivideByZeroExceptionがスローされる
    Console.WriteLine(one / (one - 1.0D))
  End Sub
End Class

0に最も近い正数

Epsilonフィールドを参照すると、Half/Single/Doubleで表現できるゼロではない最小の正の数(数直線上で0に最も近い正の数)を取得することができます。

Epsilonフィールドを参照して0に最も近い正の数・最小の正数を取得する
using System;

class Sample {
  static void Main()
  {
    Console.WriteLine("Half.Epsilon: {0}", Half.Epsilon);
    Console.WriteLine("float.Epsilon: {0}", float.Epsilon);
    Console.WriteLine("double.Epsilon: {0}", double.Epsilon);
  }
}
実行結果
Half.Epsilon: 6E-08
float.Epsilon: 1E-45
double.Epsilon: 5E-324
Epsilonフィールドを参照して0に最も近い正の数・最小の正数を取得する
Imports System

Class Sample
  Shared Sub Main()
    Console.WriteLine("Half.Epsilon: {0}", Half.Epsilon)
    Console.WriteLine("Single.Epsilon: {0}", Single.Epsilon)
    Console.WriteLine("Double.Epsilon: {0}", Double.Epsilon)
  End Sub
End Class
実行結果
Half.Epsilon: 6E-08
Single.Epsilon: 1E-45
Double.Epsilon: 5E-324

最小の負数(数直線上で0から最も離れた負の数)を取得するには、MinValueフィールドを参照します。

ヌル値

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

IntPtr/UIntPtr.Zeroフィールドを参照して値がゼロのポインタ値を取得する
using System;

class Sample {
  static void Main()
  {
    // 値がゼロのポインタ値を取得する (コンストラクタに0を指定することでも得られる)
    Console.WriteLine("{0} {1}", IntPtr.Zero, new IntPtr(0));
    Console.WriteLine("{0} {1}", UIntPtr.Zero, new UIntPtr(0));
  }
}
IntPtr/UIntPtr.Zeroフィールドを参照して値がゼロのポインタ値を取得する
Imports System

Class Sample
  Shared Sub Main()
    ' 値がゼロのポインタ値を取得する (コンストラクタに0を指定することでも得られる)
    Console.WriteLine("{0} {1}", IntPtr.Zero, New IntPtr(0))
    Console.WriteLine("{0} {1}", UIntPtr.Zero, New UIntPtr(0UI))
  End Sub
End Class
実行結果
0 0
0 0

現在の日時・日付

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);
  }
}
Imports System

Class Sample
  Shared Sub Main()
    Console.WriteLine("Today:  {0:o}", DateTime.Today)
    Console.WriteLine("Now:    {0:o}", DateTime.Now)
    Console.WriteLine("UtcNow: {0:o}", DateTime.UtcNow)
  End Sub
End Class
実行結果
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

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

DateTime/DateTimeOffsetについてより詳しくは日付・時刻の型と操作を参照してください。

型変換・丸め

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