检查字符串是空还是空的顺序?

use*_*664 9 c#

对于我的编程考试,我必须保护我写过的代码.其中一条线是:

if(app.Logourl == "" || app.Logourl == null)
Run Code Online (Sandbox Code Playgroud)

他问我null和空字符串之间是否有区别.我告诉他,区别在于它null意味着它没有指向任何东西,所以它没有实例化,但空字符串是.

考试结束后,我走到他身边,问他是否正确,因为我看到他脸上有一种滑稽的表情.他告诉我,他们是不同的,但我检查数值的顺序是不正确的.

几天后,我相信订单没有任何问题.我对么?

TL; DR

if(app.Logourl == "" || app.Logourl == null)
Run Code Online (Sandbox Code Playgroud)

相当于

if(app.Logourl == null || app.Logourl == "")
Run Code Online (Sandbox Code Playgroud)

das*_*ght 14

这是确定你所采取的方式,因为超载==System.String呼叫String.Equals,允许null秒.

但这不是通用的:如果你想检查字符串长度而不是使用== "",你的第一个代码片段将遇到麻烦:

if(app.Logourl.Length == 0 || app.Logourl == null) // <<== Wrong!
Run Code Online (Sandbox Code Playgroud)

而第二个会很好:

if(app.Logourl == null || app.Logourl.Length == 0) // <<== Correct
Run Code Online (Sandbox Code Playgroud)

这样做的原因是在评价短路||&&运营商:他们一旦知道结果(true||,false&&)他们停止评价.在上面的第二个片段中,如果app.Logourlnull,则表达式的后半部分将被忽略,因此app.Logourl.Length不会抛出空引用异常.

注意:为了识别这样的检查发生在各处,C#类库为执行此检查提供了一种方便的方法:

if (string.IsNullOrEmpty(app.Logourl)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 对于你的第一个语句,我可以添加注释,即C#规范定义的`==`运算符的所有重载,包括在nullables上提升的运算符,以及由BCL定义的`==`的所有额外重载,将允许(即不抛出)一个或两个操作数为"null".用户可能会引入一个抛出的"=="重载,但我想这将打破一个关于如何实现`==`的"契约". (2认同)