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安全?对我来说,如果出现空值,两者都会崩溃?
如果无法执行强制转换,则"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.
这两个示例在相同的情况下都会成功或失败,并且当它们成功时,行为将是相同的.
当它们失败时,结果会略有不同:第二个示例稍早失败(在演员表中),并且具有更具体的异常(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)
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |