CLRの型

CLR (Common Language Runtime)
共通言語ランタイム
CLS (Common Language Specification)
共通言語仕様

事前定義型 (Predefined types)

値型 (Value types)

値型は、データを直接格納します。

  • 構造体 (Structs)
    • 数値型 (Numeric types)
      • 整数型 (Integral types)
      • 浮動小数点型 (Floating-point types)
      • decimal
    • ブール型 (Bool type)
  • 列挙型 (Enumerations)

null 許容型 (Nullable types)

特定の値型に対して、nullも受け入れるようにできます。

         int  a = null;
// error CS0037: Null 非許容の値型であるため、Null を 'int' に変換できません

Nullable<int> b = null;
         int? c = null; // Nullable<T>の省略表現

参照型 (Reference types)

参照型は、データへの参照を格納します。

単純型 (Simple types)

単純型とは、コンパイラが直接サポートするデータ型です。この型は既存のFCLに直接マッピングされるため、次の4つのコードはすべて同一の結果をもたらします。

int          a = 0;
int          a = new int();

System.Int32 a = 0;
System.Int32 a = new System.Int32();
C#の型 FCLの型 CLS準拠 内容
bool System.Boolean trueまたはfalse
char System.Char 16ビット Unicode文字 (UTF-16)
sbyte System.SByte × 8ビット 符号付き整数値
byte System.Byte 8ビット 符号なし整数値
short System.Int16 16ビット 符号付き整数値
ushort System.UInt16 × 16ビット 符号なし整数値
int System.Int32 32ビット 符号付き整数値
uint System.UInt32 × 32ビット 符号なし整数値
long System.Int64 64ビット 符号付き整数値
ulong System.UInt64 × 64ビット 符号なし整数値
float System.Single 32ビット 浮動小数点型
double System.Double 64ビット 浮動小数点型
decimal System.Decimal 128ビット 浮動小数点型
組み込み型の一覧表 (C# リファレンス) | Microsoft Docs

参考

一意でない型

匿名型 (Anonymous types)

型を明示せず、その決定をコンパイラに委ねます。

var i = 10;

dynamic型

コンパイラによる型チェックを回避できるobject型です。コンパイル時にはobject型に変換されるため、コンパイル時にのみ意味を持ちます。

型変換 (Type Conversions)

型変換の失敗は、コンパイルエラーとして検出されます。

int i = 10;
double d = i;

int i1 = d;      // error CS0266: 型 'double' を 'int' に暗黙的に変換できません。明示的な変換が存在します (cast が不足していないかどうかを確認してください)
int i2 = (int)d; // ok
string str = "test";
int i1 = str;      // error CS0029: 型 'string' を 'int' に暗黙的に変換できません
int i2 = (int)str; // error CS0030: 型 'string' を 'int' に変換できません

派生型への変換など、実行時に型変換に失敗すると例外が投げられます。

object o = new object();
int i1 = (int)o; // System.InvalidCastException:指定されたキャストは有効ではありません。

int i = 10;
object o1 = i; // ok

安全な型変換

as演算子

変換可能ならば変換し、不可能ならば例外を投げずにnullを返します。as (C# リファレンス) | MSDN

expression as type

とすることは、次に同じです。

expression is type ? (type)expression : (type)null

変換不可能な場合を想定しないのならば、as演算子を用いず例外を投げさせます。

is演算子

指定の型に変換可能か調べられます。可能ならばtrue、さもなくばfalseが返されます。is (C# リファレンス) | MSDN

expression is type

型の情報の取得

型の宣言の情報は、System.Typeクラスから取得できます。

Typeクラス

型の宣言の情報を表すクラスです。Type クラス (System) | MSDN

メンバの情報の取得

たとえば次のような型があるとすると、

public class Foo
{
    private int field1;
    public int field2;

    public void Method1() { }

    public int Property1 { get; }
}

この型のTypeから、メンバの情報を取得できます。

Type type = typeof(Foo);

System.Reflection.MemberInfo[] memberInfos = type.GetMembers(); // すべてのパブリック メンバ

System.Reflection.FieldInfo[] fieldInfos = type.GetFields();           // すべてのパブリック フィールド
System.Reflection.MethodInfo[] methodInfos = type.GetMethods();        // すべてのパブリック メソッド
System.Reflection.PropertyInfo[] propertyInfos = type.GetProperties(); // すべてのパブリック プロパティ

Console.Write(fieldInfos[0].Name); // field2
public MemberInfo[] GetMembers()
Type.GetMembers メソッド (System) | MSDN

返されるメンバは、アルファベット順や宣言順などの特定の順番とはなりません。Remarks - Type.GetMembers Method (System)

Typeクラスのオブジェクトの取得

Typeクラスのオブジェクトは、次の方法により取得できます。

typeof演算子 (typeof expression)

型を指定して取得できます。typeof (C# リファレンス) | MSDN

Type type = typeof(int); // FullName = "System.Int32"

GetTypeメソッド

インスタンスから取得できます。Object.GetType メソッド (System) | MSDN

int a = 0;
Type type = a.GetType(); // FullName = "System.Int32"

型のサイズの取得

sizeof演算子

指定の型のバイト単位のアンマネージ サイズを取得できます。sizeof (C# リファレンス) | MSDN

int a = sizeof(int);   // 4
int b = sizeof(Int32); // 4

Marshal.SizeOfメソッド

インスタンスのバイト単位のアンマネージ サイズを取得できます。Marshal.SizeOf メソッド (Object) (System.Runtime.InteropServices) | MSDN

int x = 0;
int a = Marshal.SizeOf(x); // 4
public static int SizeOf(
    object structure
)
Marshal.SizeOf メソッド (Object) (System.Runtime.InteropServices) | MSDN
public static int SizeOf(
    Type t
)
Marshal.SizeOf メソッド (Type) (System.Runtime.InteropServices) | MSDN

参考

参考書

MSDN (Microsoft Developer Network) から検索