我知道这可能听起来像一个非常愚蠢的问题,但我对这个问题没有答案。我们的一位用户最近报告了一个错误,我意识到一小段代码使用!= string.Empty
而不是IsNullOrEmpty()
。我用IsNullOrEmpty()
修复了它,它现在运行正常,但我想真正理解这个问题
context["MODE"]
,它应该是空的。我在它上面添加了一些测试来记录:
contextBuilder.AppendLine("MODE: |" + context["MODE"] + "|");
contextBuilder.AppendLine("MODE != string.Empty: " + (context["MODE"] != string.Empty));
contextBuilder.AppendLine("MODE TRIM != string.Empty: " + (context["MODE"].ToString().Trim() != string.Empty));
contextBuilder.AppendLine("MODE.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString()));
contextBuilder.AppendLine("MODE.TRIM.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString().Trim()));
以下是关于该字段详细信息的日志:
MODE: ||
MODE != string.Empty: False
MODE TRIM != string.Empty: False
MODE.IsNullOrEmpty: True
MODE.TRIM.IsNullOrEmpty: True
以下是他的日志:
MODE: ||
MODE != string.Empty: True
MODE TRIM != string.Empty: False
MODE.IsNullOrEmpty: True
MODE.TRIM.IsNullOrEmpty: True
正如你所看到的,有一点不同:MODE != string.Empty
对我来说是假的(有道理),对他来说是对的! MODE显然不是null(否则.ToString()
会失败)问题是通过使用IsNullOrEmpty来解决的,但是我试图弄清楚为什么这不适用于某些用户的机器而不是其他机器。通常我的测试中有些人没有问题,其他人也有。
我真的不明白我能从中学到什么。为什么他的模式与null和String.Empty
不同,但IsNullOrEmpty
返回true?另请注意,修剪实际上也是string.Empty
谢谢!
答案 0 :(得分:4)
如果您使用ToString()
,则表明context["MODE"]
的类型为object
。如果使用!=
将对象与字符串进行比较,则需要比较字符串引用,而不是实际字符串值。
所以"他的模式"是一个空字符串,与string.Empty
的引用不同。
不要对字符串使用参考比较;在使用string
或==
之前,请始终确保双方都属于!=
类型。
请注意,C#编译器应该警告过您:CS0252: Possible unintended reference comparison