代码检查:类型检查和类型转换可以合并
类型测试 is 运算符的经典形式(表达式为类型 )仅在 表达式 的运行时类型与 类型 兼容且 表达式 的结果不是 null 时返回 true。
当我们使用 is 在类型转换前检查兼容性时,如以下示例所示,我们至少会遇到两个问题:
我们无故进行了两次类型检查,如果在循环中执行此操作,可能会影响性能。
对于阅读此代码的人来说,如果
obj是null,程序执行将不会进入if语句,这一点并不直观。
void Test(object obj)
{
if (obj is string)
{
string str = (string) obj;
// do something
}
}
ReSharper 建议以两种不同的方式修复此代码。
使用模式匹配变量
从 C# 7.0 开始,我们可以更优雅地使用 is 运算符来 将类型测试与变量的初始化相结合: 表达式为类型变量。 将此应用于我们的示例,我们将得到以下内容:
void Test(object obj)
{
if (obj is string)
{
string str = (string) obj;
// do something
}
}
void Test(object obj)
{
if (obj is string str)
{
// do something
}
}
分离类型测试和空值检查
我们还可以使用 as 运算符进行安全类型转换,然后进行空值检查来重写代码。 通过这种方式,我们将只有一次类型转换,而不是两次,同时更好地实现关注点分离:
void Test(object obj)
{
if (obj is string)
{
string str = (string) obj;
// do something
}
}
void Test(object obj)
{
var str = obj as string;
if (str != null)
{
// do something
}
}
最后修改日期: 2025年 9月 27日