C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#の「is」キーワードとは?型チェックの使い方をわかりやすく解説

C#における 「is」キーワード は、あるオブジェクトが特定の型にキャスト(変換)できるかどうかを判定するために使用されます。演算の結果は bool 型(true / false)として返されます。

継承関係にあるクラス同士では、派生クラスのオブジェクトは基底クラスの型として扱えるため true を返しますが、互換性のない型への変換は false となります。

サンプルコード

using System;
namespace DemoApplication{
    class Program{
        static void Main(){
            Employee emp = new PermanentEmployee{
                ID = 1,
                Name = "Martin"
            };
            // 派生クラスは基底クラスの型に変換できるため true を返す
            if (emp is Employee){
                Console.WriteLine(emp.Name + " is Employee");
            }
            else{
                Console.WriteLine(emp.Name + " is not Employee");
            }
            // 実際のオブジェクトが PermanentEmployee 型なので true を返す
            if (emp is PermanentEmployee){
                Console.WriteLine(emp.Name + " is PermanentEmployee");
            }
            else{
                Console.WriteLine(emp.Name + " is not PermanentEmployee");
            }
            // PermanentEmployee オブジェクトは ContractEmployee に
            // 変換できないため false を返す
            if (emp is ContractEmployee){
                Console.WriteLine(emp.Name + " is ContractEmployee");
            }
            else{
                Console.WriteLine(emp.Name + " is not ContractEmployee");
            }
        }
    }
    class Employee{
        public int ID { get; set; }
        public string Name { get; set; }
    }
    class PermanentEmployee : Employee{
        public int AnnualSalary { get; set; }
    }
    class ContractEmployee : Employee{
        public int HourlySalary { get; set; }
    }
}

コードのポイント

  • emp is Employee:PermanentEmployee は Employee を継承しているため、true が返ります。
  • emp is PermanentEmployee:実際に生成されたオブジェクトの型が PermanentEmployee なので、true が返ります。
  • emp is ContractEmployee:PermanentEmployee と ContractEmployee は兄弟関係にあり、相互に変換できないため、false が返ります。

補足:C# 7.0 以降のパターンマッチング

C# 7.0 以降では、「is」キーワードを使ったパターンマッチングが利用できます。型チェックとキャストを同時に行えるため、より簡潔なコードが書けます。

if (emp is PermanentEmployee pe){
    Console.WriteLine($"{pe.Name} の年間給与: {pe.AnnualSalary}");
}

このように書くことで、型判定が true の場合にのみ、キャスト済みの変数 pe がスコープ内で使えるようになります。従来のように明示的なキャストや別途の null チェックが不要になり、安全で読みやすいコードを実現できます。

  1. C#のsizeof演算子とは?データ型のサイズを取得する方法

    C#のsizeof()演算子は、指定したデータ型が占めるサイズ(バイト数)を返します。組み込みの値型に対して使用でき、メモリ管理やパフォーマンスの最適化を行う際に役立ちます。例えば、int型のサイズを調べたい場合は次のように記述します。sizeof(int);double型の場合は以下のとおりです。sizeof(double);サンプルコードそれでは、さまざまなデータ型のサイズを実際に確認できる完全な例を見てみましょう。using System; namespace Demo { class Program { static void Main(string[]

  2. Java 9におけるアンダースコア(_)キーワードとは?識別子として使えなくなった理由とエラー例を解説

    Java 9でのアンダースコアの扱いの変更点以前のバージョンのJavaでは、アンダースコア(「_」)は識別子として利用でき、変数名を作成する際にも自由に使用することができました。しかし、Java 9以降では、アンダースコア文字は予約語(キーワード)として扱われるようになり、識別子や変数名として使用することはできません。そのため、単一のアンダースコア文字を識別子として記述した場合、プログラムはコンパイルに失敗し、コンパイル時エラーが発生します。なお、実はJava 8の時点でアンダースコアを識別子として使うと警告が出るようになっており、Java 9で完全に禁止されたという経緯があります。これは、将