对于我的编程考试,我不得不捍卫我写的代码.其中一条是:
if(app.logourl == "" || app.logourl == null)
他问我是否有一个空字符串和空字符串之间的区别.我告诉他,区别是,null表示它不指向任何东西,所以没有实例化,但空字符串是.
考试后,我走到他面前问他是否正确,因为我看到他脸上有一个滑稽的样子.他告诉我,这是真的,他们是不同的,但我检查的值的顺序是不正确的.
几天后,我相信订单没有任何问题.我对么?
TL; DR
是
if(app.logourl == "" || app.logourl == null)
相当于
if(app.logourl == null || app.logourl == "")
解决方法
可以这样做,因为System.String的==的重载调用
String.Equals
,这允许null.
但是,这不是通用的:如果要检查字符串长度而不是使用==“”,则您的第一个代码片段将遇到麻烦:
if(app.logourl.Length == 0 || app.logourl == null) // <<== Wrong!
而第二个将是罚款:
if(app.logourl == null || app.logourl.Length == 0) // <<== Correct
其原因在于||的评估短路和&&操作符:一旦他们知道结果(对于||,对于&&),则停止评估).在上面的第二个代码片段中,如果app.logourl为null,表达式的后半部分将被忽略,因此app.logourl.Length不会抛出空引用异常.
注意:为了表彰像这样的检查,C#class library offers a convenience method for doing this check:
if (string.IsNullOrEmpty(app.logourl)) { ... }