この章のテーマ §
is演算子について学びます。is演算子は値の型を判定できます。
前提知識 §
Console.Writeメソッド, Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, メソッドの基礎, int型, double型, string型, object型, 継承
解説 §
is演算子は特定の値がどの型かを判定します。
int a;と宣言したら変数aの値の型はint型に決まっている。
型を判定したい場合などあり得るのか?
……と思う人もいると思いますが、実はあり得るのです。
C# には継承という機能があります。全ての型には継承関係があり、特定の型を継承して新しい型は創出されます。たとえば全ての型は祖先を辿っていくと全てobject型に辿り着きます。
つまり、int a;と宣言したら変数aの値の型はint型であると同時にobject型でもあるのです。
もっとややこしいのは、object型の変数にint型の値を格納できるという事実です。この機能でプログラムは簡素化できます。複数の関連する型を扱うたった1つのメソッドを書けるわけですから。
しかし、そうすると、渡されたのがどの型の値か判定する必要が生じる場合があります。
そういう時は、is演算子を使って、if (x is int)のように書いて判定することができます。これは変数xの値がint型ならば……という機能を示しています。
罠の数々 §
- 型のフルネームなど、型の詳細を知りたいときは、is演算子は使わずにGetTypeメソッドで型オブジェクトを取得する
- string型の値をobject型の変数に入れてもis stringは【真】になるが、byte型の値をint型の変数に入れると値の型はint型に変わってしまうのでis byteは【偽】になる。注意しよう。(これは参照型と値型の性質によって起こる現象である)
参考リンク §
is 演算子 (C# リファレンス)
サンプルソース: kw_is §
int a = 123;
double b = 123;
string c = "Hello!";
sub(a);
sub(b);
sub(c);
void sub(object x)
{
Console.Write($"x={x}: ");
if (x is int)
Console.WriteLine("それは整数型(int型)です。");
else
Console.WriteLine("それは私の知らない型です。");
}
実行結果 §
x=123: それは整数型(int型)です。
x=123: それは私の知らない型です。
x=Hello!: それは私の知らない型です。
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
string s = null;
Console.WriteLine(s is string);
- False (nullはstring型じゃないから)
- True (sはstring型だから)
- コンパイルエラー
- 実行時に例外
[[解答]]