C#NullReference Exception和ReSharper建议

Pat*_*ins 4 .net c# resharper .net-2.0

这就是我写的:

if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0)
Run Code Online (Sandbox Code Playgroud)

Resharper给我一个错误(我是ReSharper的新手...我正在尝试它)它建议我:

  if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0)
Run Code Online (Sandbox Code Playgroud)

为什么第二个是NullException安全?对我来说,如果出现空值,两者都会崩溃?

jon*_*nii 8

如果无法执行强制转换,则"as"运算符将返回null,而如果无法强制转换,则C样式强制转换将抛出异常.

我建议将其分解为多个语句:

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

Resharper不应该抱怨这个,如果PropertyIdentifier为null或者不是字符串,你也不会得到NullReferenceException.


Jay*_*uzi 5

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

当它们失败时,结果会略有不同:第二个示例稍早失败(在演员表中),并且具有更具体的异常(InvalidCastExceptionvs. NullReferenceException).

调试的主要好处是:当它们失败时,您可以在第二个示例中获得有关其失败原因的更多信息,而不是第一个示例.具体来说,如果PropertyIdentifier null与非对象string,您可以在第二种情况下告知,但不是在第一种情况下.

此外,如果您在a中try/catch,则可以在与string案例不同的代码路径中处理非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)
Run Code Online (Sandbox Code Playgroud)