快速监视显示对象等于空字符串不是空字符串

时间:2016-05-21 01:24:12

标签: c#

为什么快速手表显示声明p ==""如果是假的,我们会进入if语句。

    static void Main(string[] args)
    {
        string q = "";

        A(q);
    }

    static void A (object p)
    {
        if(p == null || p =="")
        {
            Console.WriteLine("Debugger shows false");
        }
    }

这是一个错误吗?

请注意,根据Compare string and object in c# p == ""仍应评估为true,因为""是一个实习字符串 - 这在代码执行时确实会发生,但在快速监视时失败。

enter image description here

3 个答案:

答案 0 :(得分:4)

由于p被声明为object,因此它使用引用相等,而不是值相等。问题是编译器会"实习生"用于保存内存的字符串文字,所以当你这样做时

string q = ""

编译器使用对内存中的实习字符串的引用。稍后当你做

if(p == "")

编译器已经实现了字符串,并使用了相同的引用,因此引用相等也会返回true。

QuickWatch窗口未使用实习字符串引用,因此引用p和字符串""不同的引用,并且语句的计算结果为{{ 1}}。

正确的用于比较字符串值是使用被覆盖的false并始终使用值相等:

Equals

或只是

if(p == null || p.Equals(""))  // should evaluate to "true" in both places.

编译器警告你这个常见的错误;如果将鼠标悬停在IDE中的绿色下划线上,您将看到警告消息。

答案 1 :(得分:2)

这是指向字符串类的链接:

https://msdn.microsoft.com/en-us/library/362314fe.aspx

object和string都是引用类型,但string对链接中提到的相等运算符的处理方式不同。

另外,我使用string.IsNullOrEmpty(string)来检查字符串是空还是空。

答案 2 :(得分:0)

我认为你可以使用

(string.IsNullOrEmpty(p.ToString()))
相关问题