ReSharper 2025.2 Help

代码检查:类型检查和类型转换可以合并

类型测试 is 运算符的经典形式(表达式为类型 )仅在 表达式 的运行时类型与 类型 兼容且 表达式 的结果不是 null 时返回 true

当我们使用 is 在类型转换前检查兼容性时,如以下示例所示,我们至少会遇到两个问题:

  • 我们无故进行了两次类型检查,如果在循环中执行此操作,可能会影响性能。

  • 对于阅读此代码的人来说,如果 objnull ,程序执行将不会进入 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日