C#==操作符在立即窗口行为不同于在运行时
尝试在立即窗口中以下内容:C#==操作符在立即窗口行为不同于在运行时
object a1 = "a";
object a2 = "a";
a1==a2 // outputs false
,你会看到a1 == a2
输出false
。
然而,在任何一个窗口应用程序或控制台运行时,你会得到true
:
object t1 = "a";
object t2 = "a";
MessageBox.Show((t1 == t2).ToString()); // outputs true
运行时行为与定义为==
运营商和字符串相一致。
有没有人知道这是一个在立即窗口中的错误?
你所描述的是正确的行为。
==
的定义在Object
中比较了参考文献的论点。这与针对String
的==
的实现不同,后者比较了字符串的值。 C#中的运算符不是虚拟的。这意味着即使您的对象实际上是字符串,因为静态类型是object
,因此调用==
的,这意味着将进行参考比较。
在C#字符串中可以是interned在实习生池中。通常,当您在运行时创建新字符串时,您会收到对全新字符串对象的引用。要获得实习字符串,您可以调用string.Intern方法。但是,当编译C#代码时,文字字符串会自动为您自动执行,因此如果在代码中的两个位置具有相同的文字字符串,您将获得对同一字符串对象的引用。
在即时窗口中,字符串显然不是实际的 - 每次都会创建新的字符串,即使它们具有相同的值。但是在.NET中没有要求所有字符串都必须被实施,所以我不认为这是一个错误。
你的代码应该避免依赖于字符串是否被实现,因为这是一个实现细节。
只是为了说明OP:操作符不参与多态性,所以在这种情况下,使用'=='的Object对象实现,而不是'String'实现,因此这种意外行为。 – 2010-05-25 13:46:23
我不同意“正确的行为”声明。 即时窗口行为与MSDN文档和运行时间不一致,甚至在您放置断点并实际测试代码中存在的变量时也不符合本身。我个人认为微软应该解决这个问题。 – 2010-05-25 14:51:42
@Damiano:你是什么意思:“立即窗口行为与自己不一致,当你放置一个断点并且实际测试代码中存在的变量时”。你能给个例子吗? “即时窗口行为与MSDN文档不一致”您提到的文档有哪些特定部分? – 2010-05-25 15:28:52
这不是一个错误;运行时代码工作的原因是因为这些字符串是被执行的(也就是说,这些特定字符序列在内存中只有一个表示,每个对常量"a"
的引用指的是内存中的同一个点)。在即时窗口中,为每个窗口创建一个新字符串,因此当它们的内容相同时,对象指向内存中的不同位置。
上的引用类型使用==
操作者执行一个基准比较(除非为对象的特定类型被引用的,而不是该对象是在这种情况下--meaning object
,不string
--alters此行为)。由于编译的文字字符串是被执行的,它们具有相同的引用。由于即时窗口字符串是新字符串,因此它们不具有相同的引用。
可能在运行时编译器会优化字符串文字以指向相同的引用位置,但在即时窗口中不会发生此优化。
我会建议如果关闭优化,那么非即时版本也会返回false。如前所述,这不是一个bug,它是由编译器内优化而不是直接窗口内的优化造成的一个怪癖。
+1只是因为我从来没有见过立即窗口,它看起来很整洁! – RichK 2010-05-25 14:43:14