2021年12月22日
川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説! total 763 count

is演算子: 値の型を調べてみよう

Written By: 川俣 晶連絡先

この章のテーマ §

 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);

  1. False (nullはstring型じゃないから)
  2. True (sはstring型だから)
  3. コンパイルエラー
  4. 実行時に例外

[[解答]]

単行本情報