C# is关键字

示例

检查对象是否与给定类型兼容,即对象是该BaseInterface类型的实例还是从BaseInterface以下类型派生的类型:

interface BaseInterface {}
class BaseClass : BaseInterface {}
class DerivedClass : BaseClass {}

var d = new DerivedClass();
Console.WriteLine(d is DerivedClass);  // 真正
Console.WriteLine(d is BaseClass);     // 真正
Console.WriteLine(d is BaseInterface); // 真正
Console.WriteLine(d is object);        // 真正
Console.WriteLine(d is string);        // 假

var b = new BaseClass();
Console.WriteLine(b is DerivedClass);  // 假
Console.WriteLine(b is BaseClass);     // 真正
Console.WriteLine(b is BaseInterface); // 真正
Console.WriteLine(b is object);        // 真正
Console.WriteLine(b is string);        // 假

如果强制转换的目的是使用对象,则最佳做法是使用as关键字'

interface BaseInterface {}
class BaseClass : BaseInterface {}
class DerivedClass : BaseClass {}

var d = new DerivedClass();
Console.WriteLine(d is DerivedClass);  // 真正 - valid use of 'is'
Console.WriteLine(d is BaseClass);     // 真正 - valid use of 'is'

if(d is BaseClass){
    var castedD = (BaseClass)d;
    castedD.Method(); // 有效,但不是最佳做法
}

var asD = d as BaseClass;

if(asD!=null){
    asD.Method(); //首选方法,因为您只需承担一次拆箱罚款
}

但是,从C#7pattern matching功能扩展了is运算符以检查类型并同时声明一个新变量。与C#7相同的代码部分:

7.0
if(d is BaseClass asD ){
    asD.Method();
}