2016-03-11 133 views
5

我知道这可能听起来像一个非常愚蠢的问题,但我没有回答这个问题。我们的一位用户最近报告了一个错误,我意识到一小段代码使用!= 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对我来说是假的(有道理),对他来说是真的!模式显然不为空(否则.ToString()将失败)问题是通过使用IsNullOrEmpty解决的,但我试图弄清楚为什么这不适用于某些用户的机器,而不是其他人。通常在我的测试中,我们有些人没有问题,其他人也没有问题。

我真的不明白我能学到什么。为什么他的模式与null和String.Empty不同,但IsNullOrEmpty返回true?另外请注意,修剪实际上也是string.Empty以及

谢谢!

+1

'IsNullOrEmpty'实际上是由'Length'比较0 – juharr

+1

尝试还打印出'上下文[“模式”]做的空白部分。 GetType()。Name“。 – juharr

+0

您可以提供更多关于'context [“MODE”]'中的值来源的细节吗?另外,您是否确保两个机器上的.NET版本相同? –

回答

4

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

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

不要在字符串上使用引用比较;在使用==!=之前,始终确保双方的型号为string

注意,C#编译器应该警告你这一点:CS0252: Possible unintended reference comparison

+0

@clcto这是正确的输出,因为不等于'String.Empty'返回false,这意味着它_is_等于'String.Empty' – Setsu

+0

正如我所说这是一个老的代码,由正在在我加入公司之前对应用程序进行了关怀(而且,他错过了一个警告!)。我在这里想知道为什么他的结果是这样?他的输入是空的,但没有与'string.Empty'相同的引用。但是,当我修剪它有相同的参考!这将如何发生? – Damascus

+0

Trim()的返回类型是'string',所以编译器在这种情况下使用值比较。 – Daniel

相关问题