PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

c#のis演算子とtypeofの型判定の挙動の違い

c#

f:id:Takachan:20170114224940j:plain

コード書けばすぐわかる事なんですがis演算子の挙動の話です。

is演算子は複数の型でtrueになる可能性があります。
親子関係がある型で厳密に型を判定したい場合、GetType()とtypeofを使います。

// こんなクラスがあったとして、、
public class BaseClass { }
public class DerivedClass_1 : BaseClass { }
public class DerivedClass_2 : BaseClass { }

// こんなコードを書いたとすると
static void Main(string[] args)
{

    BaseClass test = new DerivedClass_1();

    // is演算子による型判定
    Console.WriteLine("test is BaseClass? = " 
        + (test is BaseClass));
    Console.WriteLine("test is DerivedClass_1? = " 
        + (test is DerivedClass_1));
    Console.WriteLine("test is DerivedClass_2? = " 
        + (test is DerivedClass_2) + "\r\n");

    // typeによる型判定
    Console.WriteLine("test typeof BaseClass? = " 
        + (test.GetType() == typeof(BaseClass)));
    Console.WriteLine("test typeof DerivedClass_1? = " 
        + (test.GetType() == typeof(DerivedClass_1)));
    Console.WriteLine("test typeof DerivedClass_2? = " 
        + (test.GetType() == typeof(DerivedClass_2)));

    Console.ReadLine();
}

出力は以下の通りになります。

test is BaseClass? = True ★この部分
test is DerivedClass_1? = True
test is DerivedClass_2? = False

test typeof BaseClass? = False
test typeof DerivedClass_1? = True
test typeof DerivedClass_2? = False

★の部分で違いがあります。

is演算子はアップキャストできる型の場合trueです。

広告を非表示にする