Joh*_*han 19 c# asp.net resharper
var foo = context.FOOTABLE.FirstOrDefault();
var bar = foo != null ? foo.SomeBool : false;
Run Code Online (Sandbox Code Playgroud)
Resharper告诉我Simplify conditional ternary expression
.但我觉得这里需要进行空检查,因为FirstOrDefault()
可以返回null.
那么,谁错了,我还是Resharper?
Aak*_*shM 34
首先,一个完整的例子:
class Foo
{
public bool SomeBool { get; set; }
}
class Program
{
static void Main(string[] args)
{
var foo = MaybeFoo();
var bar = foo != null && foo.SomeBool;
}
static Foo MaybeFoo()
{
return new Random().Next() < 10 ? null : new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
这MaybeFoo
是一种有时返回null
并有时返回的方法Foo
.我已经习惯了Random
,R#不会自动解决它始终为null或不为null的问题.
现在,如你所说:
var bar = foo != null ? foo.SomeBool : false;
Run Code Online (Sandbox Code Playgroud)
R#提供检查简化条件运算符.这是什么意思?好吧,像往常一样,我们可以Alt+ Enter并接受建议,看看它想要替换它,在这种情况下是:
var bar = foo != null && foo.SomeBool;
Run Code Online (Sandbox Code Playgroud)
现在,关于你的关注:
但我觉得这里需要进行空检查,因为FirstOrDefault()可以返回null.
那么,谁错了,我还是Resharper?
嗯,不久之后,你就是.目前仍然是一个空检查发生在这里,并在&&
运营商短路,所以第二个操作数(foo.SomeBool
),如果第一个是将只进行评估true
.所以NullReferenceException
在什么时候foo
不会有null
; 第一次检查将失败bar
并将被分配false
.
所以这两行
var bar = foo != null ? foo.SomeBool : false;
Run Code Online (Sandbox Code Playgroud)
和
var bar = foo != null && foo.SomeBool;
Run Code Online (Sandbox Code Playgroud)
在语义上是等价的,并且R#通常更喜欢更简洁的版本(特别是,条件中的显式true
s和false
s通常是冗余代码的标记).您可能不会,在这种情况下,您可以关闭此检查.
ReSharper建议将您的代码更改为:
var bar = foo != null && foo.SomeBool;
Run Code Online (Sandbox Code Playgroud)
这与三元操作完全相同,但看起来更好.代码的逻辑不会改变.
归档时间: |
|
查看次数: |
14332 次 |
最近记录: |