is 和 as 是和继承有关的操作符
IBankAccount venusAccount = new SaverAccount();
前情提要: 下面的例子中,入参是object类型,方法体里需要使用IBankAccount接口的成员,所以必须要进行类型转换 (IBankAccount)o
- 正常情况下,o是继承自IBankAccount的类型,就没问题
- 有一种failure mode, o不是继承自IBankAccount的类型,那么就会有InvalidCastException
我们不希望(IBankAccount)o 抛InvalidCastException,其解决办法就是as 操作符
public void WorkWithManyDifferentObjects(object o)
{
IBankAccount account = (IBankAccount)o;
//work with the account
}
as 操作符
工作原理 : o as IBankAccount
- 返回对象引用
- 从不抛出InvalidCastException,如果o不是想要的类型,就返回null
- 最好在使用返回的对象引用之前验证它是否为空,否则会抛出NullReferenceException
public void WorkWithManyDifferentObjects(object o)
{
IBankAccount account = o as IBankAccount;
if(account != null)
{
//work with the account
}
}
is 操作符
前面: 用as先转换,然后检查对象引用是否为null
而下例中,用is也能达到相同的目的,甚至比as的用法看起来还要更简洁些。
用is先检查类型,然后如果类型对,紧接着就顺手声明一个转换后的类型的变量。
public void WorkWithManyDifferentObjects(object o)
{
if(o is IBankAccount account)
{
//work with the account
}
}
注意: 一边用is检查,一边跟着变量声明,这是c# 7的新特性。是模式匹配功能的一部分。