Dam*_*cus 5 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()));
Run Code Online (Sandbox Code Playgroud)
以下是我关于该字段详细信息的日志:
MODE: ||
MODE != string.Empty: False
MODE TRIM != string.Empty: False
MODE.IsNullOrEmpty: True
MODE.TRIM.IsNullOrEmpty: True
Run Code Online (Sandbox Code Playgroud)
这是他的日志:
MODE: ||
MODE != string.Empty: True
MODE TRIM != string.Empty: False
MODE.IsNullOrEmpty: True
MODE.TRIM.IsNullOrEmpty: True
Run Code Online (Sandbox Code Playgroud)
你可以看到有一点不同:MODE != string.Empty对我来说是假的(有道理),对他来说是对的!MODE显然不是null(否则.ToString()会失败)问题是通过使用IsNullOrEmpty解决的,但我正在试图弄清楚为什么这对某些用户的机器而不是其他机器不起作用.通常我的测试中有些人没有问题,其他人也有.
我真的不明白我能从中学到什么.为什么他的模式与null不同String.Empty,但是IsNullOrEmpty返回true?另请注意,饰边实际上string.Empty也是如此
谢谢!
如果您使用ToString(),则表明 的类型context["MODE"]是object。如果使用 比较对象与字符串!=,则比较的是字符串引用,而不是实际的字符串值。
因此“his mode”是一个空字符串,与 不同string.Empty。
不要对字符串使用引用比较;string在使用==或之前,始终确保两侧的类型相同!=。
请注意,C# 编译器应该警告您这一点:CS0252:可能的意外引用比较