C#NullReference异常和重新精简建议

C#NullReference异常和重新精简建议,c#,.net,.net-2.0,resharper,C#,.net,.net 2.0,Resharper,这是我写的: if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0) Resharper给了我一个错误(我是Resharper的新手…我正在尝试),它提示我: if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0) 为什么第二个是空异常安全的?对我来说,如果出现null值,两者都将崩溃?如果无法执行强制转换,

这是我写的:

if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0)
Resharper给了我一个错误(我是Resharper的新手…我正在尝试),它提示我:

  if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0)

为什么第二个是空异常安全的?对我来说,如果出现null值,两者都将崩溃?

如果无法执行强制转换,“as”操作符将返回null,而C样式强制转换如果无法执行,将抛出异常

我建议将其分为多个陈述:

string propertyIdentifier = lstProperty[u].PropertyIdentifier as string;
if(propertyIdentifier != null && propertyIdentifier.CompareTo("Name") == 0)
{
    ... your if statement ...
}

Resharper不应该抱怨这一点,如果PropertyIdentifier为null或不是字符串,您也不会得到NullReferenceException。

两个示例在相同的情况下成功或失败,当它们成功时,行为将是相同的

当它们失败时,结果将略有不同:第二个示例失败的时间稍早(在强制转换时),并且出现了更具体的异常(
InvalidCastException
vs.
NullReferenceException

调试的主要好处是:当它们失败时,您可以在第二个示例中获得比第一个示例中更多的关于为什么失败的信息。具体来说,如果PropertyIdentifier为
null
与非
字符串
相比,您可以在第二种情况下判断,但在第一种情况下不能

此外,如果您处于
try/catch
,则可以在
null
案例以外的单独代码路径中处理非
字符串
案例。然而,您可能不应该这样编码:如果您这样做了,那么您在做其他错误的事情

如果您在各种情况下单步执行以下代码,可能有助于说明情况:

var propertyI = lstProperty[i];
var propertyIdentifier = propertyI.PropertyIdentifier;

// pick one of these:
var propertyIdentifierAsString = propertyIdentifier as string;
var propertyIdentifierAsString = (string)propertyIdentifier;

if (propertyIdentifierAsString.CompareTo("Name") == 0)