在尝试用 C# 实现一个简单的单链表时,我注意到==
在比较用 int 值装箱的两个对象类型变量时不起作用,但是.Equals
works.
想检查一下为什么会这样。
下面的代码片段是通用对象类型数据属性
public class Node {
/// <summary>
/// Data contained in the node
/// </summary>
private object Data { get; set; };
}
下面的代码遍历单链表并搜索对象类型的值 -
/// <summary>
/// <param name="d">Data to be searched in all the nodes of a singly linked list
/// Traverses through each node of a singly linked list and searches for an element
/// <returns>Node if the searched element exists else null </returns>
public Node Search(object d)
{
Node temp = head;
while (temp != null)
{
if (temp.Data.Equals(d))
{
return temp;
}
temp = temp.Next;
}
return null;
}
但是,如果我更换
temp.Data.Equals(d)
和
temp.Data == d
即使它停止工作temp.Data
and d
两者的值为“3”。任何原因==
不适用于对象类型变量?
这是 Main 函数的片段 -
SinglyLinkedList list = new SinglyLinkedList();
list.Insert(1);
list.Insert(2);
list.Insert(3);
list.Insert(4);
list.Insert(5);
list.Print();
Node mid = list.Search(3);
我相信因为我传递了一个 int 值3
并且 Search 方法需要一个对象类型,它会成功地将 3 装箱为对象类型。然而,不知道为什么==
不起作用但是.Equals
does.
Is ==
仅对值类型重载运算符?
原因有二:
-
Equals
不受限于==
反之亦然,默认情况下检查引用相等性:
正如您可以在规格中阅读的那样.Equals vs ==:
默认情况下,运营商==
通过确定两个引用是否指示同一个对象来测试引用相等性,因此引用类型不需要实现运算符==
为了获得这个功能。当类型不可变时,意味着实例中包含的数据不能更改,重载运算符==
比较值相等而不是引用相等可能很有用,因为作为不可变对象,只要它们具有相同的值,就可以认为它们是相同的。重写运算符==
不建议在非不可变类型中使用。
重载运算符==
实现不应抛出异常。任何重载运算符的类型==
还应该重载运算符!=
.
虽然如果不重写编译器会抛出错误!=
也会警告你最好覆盖这两个.Equals
and .GetHashCode
.
所以重写/重载.Equals
, ==
and !=
是不同的东西。压倒一切.Equals
对超载没有影响==
and !=
。毕竟==
是一个自定义运算符。尽管这样做并不明智,但您可以将其用于相等检查之外的其他目的。
-
此外,运营商解决了编译时:
以下面为例csharp
交互式shell程序:
$ csharp
Mono C# Shell, type "help;" for help
Enter statements below.
csharp> public class Foo {
>
> public int data;
>
> public static bool operator == (Foo f1, Foo f2) {
> return f1.data == f2.data;
> }
>
> public static bool operator != (Foo f1, Foo f2) {
>
> return f1.data != f2.data;
> }
>
> }
(1,15): warning CS0660: `Foo' defines operator == or operator != but does not override Object.Equals(object o)
(1,15): warning CS0661: `Foo' defines operator == or operator != but does not override Object.GetHashCode()
csharp> object f = new Foo();
csharp> object f2 = new Foo();
csharp> f == f2
false
csharp> Foo f3 = f as Foo;
csharp> Foo f4 = f2 as Foo;
csharp> f3 == f4
true
如你看到的,==
如果您将对象称为object
, or as Foo
。由于您使用object
,编译时 C# 可以进行的唯一绑定是引用相等的绑定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)