为什么快速手表显示声明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
,因为""
是一个实习字符串 - 这在代码执行时确实会发生,但在快速监视时失败。
答案 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()))