比较字符串与!=运算符给出不同的结果?

时间:2016-03-11 17:52:06

标签: c# string-comparison comparison-operators

我知道这可能听起来像一个非常愚蠢的问题,但我对这个问题没有答案。我们的一位用户最近报告了一个错误,我意识到一小段代码使用!= 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

谢谢!

1 个答案:

答案 0 :(得分:4)

如果您使用ToString(),则表明context["MODE"]的类型为object。如果使用!=将对象与字符串进行比较,则需要比较字符串引用,而不是实际字符串值。

所以"他的模式"是一个空字符串,与string.Empty的引用不同。

不要对字符串使用参考比较;在使用string==之前,请始终确保双方都属于!=类型。

请注意,C#编译器应该警告过您:CS0252: Possible unintended reference comparison