Moh*_*kar 152 .net c# vb.net comparison
我在C#中有两个对象,不知道它是布尔值还是其他任何类型.但是,当我尝试比较那些C#未能给出正确答案时.我用VB.NET尝试了相同的代码并且做到了!
如果有解决方案,谁能告诉我如何解决这个问题?
C#:
object a = true;
object b = true;
object c = false;
if (a == b) c = true;
MessageBox.Show(c.ToString()); //Outputs False !!
Run Code Online (Sandbox Code Playgroud)
VB.NET:
Dim a As Object = True
Dim b As Object = True
Dim c As Object = False
If (a = b) Then c = True
MessageBox.Show(c.ToString()) '// Outputs True
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 167
在C#中,==
运算符(当应用于引用类型表达式时)执行引用相等性检查,除非它被重载.您正在比较两个引用是拳击转换的结果,因此这些是不同的引用.
编辑:对于重载的类型==
,您可以获得不同的行为 - 但这是基于表达式的编译时类型.例如,string
提供==(string, string
):
string x = new string("foo".ToCharArray());
string y = new string("foo".ToCharArray());
Console.WriteLine(x == y); // True
Console.WriteLine((object) x == (object) y); // False
Run Code Online (Sandbox Code Playgroud)
这里第一个比较是使用重载运算符,但第二个是使用"默认"引用比较.
在VB中,=
操作员完成了更多的工作 - 它甚至不等同于使用object.Equals(x, y)
,因为类似的东西Option Compare
会影响文本的比较.
从根本上说的运营商不相同的方式工作,并且不打算以相同的方式工作.
Kon*_*lph 79
除了Jon的答案解释了事物的C#方面,这是VB的作用:
在VB中Option Strict On
,通过=
总是测试值相等而不是参考相等来进行比较.实际上,一旦切换,您的代码甚至不会编译,Option Strict On
因为System.Object
没有定义Operator=
.你应该总是选择这个选项,它比金星捕蝇草更有效地捕获虫子(尽管在你的特殊情况下,这种松懈的行为实际上是正确的).1
事实上,使用Option Strict On
VB,行为甚至比C#更严格:在C#中,a == b
要么触发调用,要么SomeType.operator==(a, b)
如果不存在,则调用引用相等比较(相当于调用object.ReferenceEquals(a, b)
).
另一方面,在VB中,比较a = b
总是调用相等运算符.2如果要使用引用相等性比较,则必须使用a Is b
(再次,相同Object.ReferenceEquals(a, b)
).
1)这是一个很好的指示,为什么使用Option Strict Off
是一个坏主意:我已经使用VB.NET近十年,从.NET正式发布之前到几年前,我完全不知道a = b
它有什么用Option Strict Off
.它做了某种平等比较,但究竟发生了什么,为什么,不知道.它比C#的dynamic
功能更复杂(因为它依赖于记录良好的API).以下是MSDN所说的内容:
因为
Option Strict On
提供强类型,防止意外的类型转换与数据丢失,不允许后期绑定,并提高性能,强烈建议使用它.
2) Jon提到了一个例外,字符串,其中为了向后兼容性,相等比较做了更多的事情.