この章のテーマ §
typeof演算子について学びます。typeof演算子は型の詳細情報を知ることができる便利な演算子です。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, int型, string型, 型パラメータ
解説 §
型の情報を持った型オブジェクトは通常、GetTypeメソッドで取得できます。この型オブジェクトには、型のフルネーム(FullName)などを始め多くの情報が詰まっています。
しかし、GetTypeメソッドは値が存在しなければ使用できません。
たとえば、値の1に対してGetTypeメソッドを実行することはできますが、intという型に対しては実行できません。
そのため、型名から直接型オブジェクトを得るためにtypeof演算子が存在します。
サンプルソースの通り、1.GetType()と書いてもtypeof(int)と書いても、同じint型の型オブジェクトが取得でき、フルネームのSystem.Int32を取得できます。
この機能は、一見意味がないように思えます。
取得できるものが決まっているからです。
しかし、いくつかのケースではとても便利です。
たとえば、型パラメータと併用するととても便利です。サンプルソースのsubメソッドのように、型パラメータに対してtypeof演算子を使うと返ってくる値は可変となり、取得する意味が出てきます。実行するまで何が返ってくるか分からないのです。
罠の数々 §
- typeof演算子が使用できない型がいくつか存在する。dynamic型や、string?のようなNULL 許容参照型では typeof 演算子を使用できない
- ビギナーは型オブジェクトの有り難みが分からないと思うが、中級以上になると凄く便利になる。たとえば、型のメンバーを列挙して操作を加えたりできる。それによって、短いコードで全てのメンバーを書き換えたりできる
参考リンク §
typeof 演算子
サンプルソース: kw_typeof §
Console.WriteLine($"1.GetType().FullName = {1.GetType().FullName}");
Console.WriteLine($"typeof(int).FullName = {typeof(int).FullName}");
Console.WriteLine("Tがintの場合");
sub<int>();
Console.WriteLine("Tがstringの場合");
sub<string>();
void sub<T>()
{
Console.WriteLine($"typeof(T).FullName = {typeof(T).FullName}");
}
実行結果 §
1.GetType().FullName = System.Int32
typeof(int).FullName = System.Int32
Tがintの場合
typeof(T).FullName = System.Int32
Tがstringの場合
typeof(T).FullName = System.String
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
sub<string?>();
void sub<T>()
{
Console.WriteLine($"typeof(T).FullName = {typeof(T).FullName}");
}
- null
- string
- string?
- コンパイルエラー
- 実行時に例外
[[解答]]