4

这是我写的:

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

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

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

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

4

2 回答 2

8

如果无法执行强制转换,'as' 运算符将返回 null,而如果无法强制转换,C 风格的强制转换将引发异常。

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

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

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

于 2008-11-03T15:54:00.127 回答
5

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

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

主要的好处是调试:当它们失败时,您可以在第二个示例中比第一个示例中获得更多关于失败原因的信息。具体来说,如果 PropertyIdentifier 是nullvs. non- string,您可以在第二种情况下判断,但不能在第一种情况下判断。

此外,如果您在 a 中,则可以在与case 不同的代码路径中try/catch处理 non- case。但是,您可能不应该这样编码:如果是这样,那么您做错了其他事情。stringnull

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

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)
于 2008-11-03T16:10:24.117 回答