2008-11-03 26 views
4

这是我写:C#NullReference异常和ReSharper的建议

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

ReSharper的把我的错误(我是新与ReSharper的...我想它),它表明我:

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

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

回答

8

如果不能执行强制转换,那么'as'操作符将返回null,而C风格强制转换将在无法强制转换时抛出异常。

我建议打破这一点到多条语句:

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

ReSharper的不应该抱怨这个,你也不会得到一个NullReferenceException如果PropertyIdentifier为空或不是一个字符串。

+0

这是我的想法!谢谢 – 2008-11-03 16:02:39

5

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

当它们失败时,结果会稍有不同:第二个示例稍早失败(在演员表),另一个示例更具体的例外(InvalidCastExceptionNullReferenceException)。

主要优势在于调试:当它们失败时,您会在第二个示例中获得关于失败原因的更多信息。具体而言,如果PropertyIdentifier为null与非string,则可以在第二种情况下进行分析,但不能在第一种情况下进行分析。

另外,如果您处于try/catch中,则可以在与null情况不同的代码路径中处理非string大小写。但是,你可能不应该用这种方式编码:如果你是这样,你还在做其他的事。

这可能有助于阐明这种情况,如果你通过下面的代码在不同的情况下步骤:

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) 
+0

感谢有关try/catch +1的信息 – 2008-11-03 16:17:38

相关问题