in c#当你与两个对象上的“==”运算符进行比较时,背景中究竟发生了什么?它只是比较地址?或者像Equals()或CompareTo()那样?C#==运算符详细说明了什么?
PS:那么Java中的“==”运算符呢?它的行为是否一样?
in c#当你与两个对象上的“==”运算符进行比较时,背景中究竟发生了什么?它只是比较地址?或者像Equals()或CompareTo()那样?C#==运算符详细说明了什么?
PS:那么Java中的“==”运算符呢?它的行为是否一样?
据我知道:
等于在对象中实现,也可以被覆盖。 Object中的默认实现为参考类型执行参考比较。所以默认情况下,Equals和==也是这样。
我想在java中你不能重载==操作符。但是我的Java知识很不合时宜。
编辑: 注意,==
运营商是一个静态方法。它在编译时根据变量或字段的类型进行绑定。 Equals
是基于实际运行时类型在运行时找到的虚拟方法。
优秀的答案;至少有一个遗漏,虽然:http://stackoverflow.com/questions/806020/snip/806068#806068 – 2009-04-30 09:19:42
你不能覆盖==运算符在java中,对于java中的引用类型==将始终做一个引用(标识)比较。 – 2009-04-30 09:23:30
对于预定义的值的类型,如果 的操作数的值相等的 等号(==)返回true, 否则为假。对于字符串以外的参考类型 ,==返回true,如果 其两个操作数指向相同的 对象。对于字符串类型,== 比较字符串的值。
否... ==运算符在java和c#中并不总是表现相同。
例如使用字符串; Java ==不会比较字符串对象的引用......(如果您使用primitve类型,则java中的==比较值)。这就是为什么
// returns FALSE in JAVA
(new String("test") == "test")
不会返回在Java真的...
在C#相比之下,==操作者的行为对字符串不同。例如,它会在以下情况下返回true:
// returns TRUE in C#
(new String("test".ToCharArray()) == "test")
进行了扩展,Stefan's excellent answer - 另一个例外是,如果操作数涉及Nullable<T>
- 在这种情况下,“解禁”运营商应用(14.2。7在ECMA 334v4):
对于相等运算 == =
操作者的提升形式存在如果操作数的类型是既 非空值类型,并且如果 结果类型!是bool。解除表格 是通过添加单个?对每个操作数类型使用 修饰符。解除运算符认为两个空值 值相等,而空值不相等 为任何非空值。如果两个 操作数非空,解除操作数的操作数解除 将底层操作符应用于 生成布尔结果。
这是什么意思是:因为有之间的平等的运营商(比方说):
int i = ..., j = ...;
bool eq = i == j;
因此存在形式的隐式操作(虽然做不同):
int? i = ..., j = ...;
bool eq;
if(i.HasValue) {
if(j.HasValue) { // both have values; compare
eq = i.GetValueOrDefault() == j.GetValueOrDefault();
} else { // one null; always false
eq = false;
}
} else { // true if both null, else false
eq = !j.HasValue;
}
==运算符的行为取决于你所应用的变量是如何声明的(不在对象的类上,我将添加一个示例)。
对于值类型,它会比较它们的值。
对于引用类型a == b如果a与b是同一个对象,则返回true,除非==操作符被重载。不像其他人所说的那样覆盖,你不能在c#中重载运算符,因为它们不是虚拟的。
object obj_a, obj_b; string str_a, str_b;
str_a = "ABC";
str_b = new string("ABC".ToCharArray());
obj_a = str_a;
obj_b = str_b;
Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded
Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals
Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded
Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed.
Console.ReadKey();
该程序的输出是
str_a == str_b = True str_a.Equals(str_b) = True obj_a == obj_b = False obj_a.Equals(obj_b) = True
只是一个快速的信息:如果你重载==,还必须实现!=。 <= and > =也是如此。 – Tarik 2010-04-08 03:03:34