Resharper是一个很棒的工具,但它有时让我对建议的代码真正含义感到困惑。我有这段代码:
private bool DoesUserExists()
{
var user = De.Users.FirstOrDefault(u => u.Username == CurrentUser.Username);
return user != null;
}
我最初有:
if(user == null)
return false;
else
return true;
但Resharper建议使用顶级代码。但是,如果它不是null,那我认为是返回用户。但该方法只接受bool返回而不是类。
那么返回用户!= null实际上返回什么时它是null而不是什么时候?
答案 0 :(得分:7)
那么当
return user != null
为空时它实际返回什么 什么时候不是
它只是评估表达式。如果user
为null,则返回false
,如果user
不为null,则返回true
。
将此想象为将比较结果分配给局部变量,然后将其返回:
bool isNotNull = user != null;
return isNotNull;
或者:
bool isNull = user == null;
return !isNull;
仅当isNotNull
变量不为空时, user
才会为真。
从语义上讲,它与您的if-else
语句相同。
答案 1 :(得分:3)
不确定我在这里添加任何值,@ Yuval的回答是正确而明确的,但也许这样看是有帮助的。
您正在考虑解析这样的代码:
(return user) (!= null)
也就是说,你会看到“返回用户”并想知道该行的其余部分是做什么的。但return
不起作用。它评估该行的其余部分,并返回该行。它更像是
(return) (everything else)
或者,在特定情况下
(return) (user != null)
最后执行return
。
它非常类似于运算符优先级,其中3 + 5 * 2必须被评估为3 + 10而不是8 * 2,因为*
具有比+
更高的优先级(必须首先评估) 。 return
的优先级最低。
如果您在学习阅读和编写代码时考虑到这一点,您会发现自己很欣赏重构的代码。