C#中的相等

前几天看了一篇文章,总结下
源代码:
int t1 = 10;
int t2 = 10;
Console.WriteLine(t1 == t2); (对值类型进行比较)
Console.WriteLine(t1.Equals(t2));(值类型中重写了Equal)

        object a1 = 15;//a1.GetType = Int32,即父类型a1是object,存储的是子类型Int32
        object a2 = 15;
        Console.WriteLine(a1 == a2);//false 比较的是object类型,即引用类型,地址不同,所以为false
        Console.WriteLine(a1.Equals(a2));//true   虽然调用的是object类中的Equal方法,但最终执行的是值类型Int32中重写的Equal方法,比较的是值

        object b1 = new StringBuilder("a1");
        object b2 = new StringBuilder("a1");
        object b3 = b1;
        Console.WriteLine(b1 == b2);//false 比较的是引用类型,所以比较地址
        Console.WriteLine(b1.Equals(b2));//false 最终执行的Equal是实际类(StringBuilder)中重写的Equals方式,比较的是引用
        Console.WriteLine(b1 == b3);//true
        Console.WriteLine(b1.Equals(b3));//true

        object c1 = "a1";
        object c2 = "a1";
        Console.WriteLine(c1 == c2);//true string类特殊,虽然是引用类型,但比较值,而非地址
        Console.WriteLine(c1.Equals(c2));//true

        Console.Read();

msdn对于 ==和 equals的解释:

== 的解释:
对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。 对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。 对于 string 类型,== 比较字符串的值。

equals的解释:
如果当前实例是引用类型,Equals(Object)方法测试引用相等性,并调用Equals(Object)方法等效于调用ReferenceEquals方法。 引用相等性意味着进行比较的对象变量引用同一个对象
如果当前实例是值类型,Equals(Object)方法测试值是否相等

有一个评论说:
== 是静态函数,并不属于某个对象,编译器根据左右参数的类型去执行匹配的重载;
Equals 是虚函数,可以在所有类型里面重写,这样即使调用的是 object 的 Equals,实际上调用的是 object 的具体对象的 Equals

有一本教材上说:
在比较值类型的相等性时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()
用于比较值,比较运算符可以看作一个中间项。但最大的区别是值类型需要装箱,才能把它们转换
为引用,进而才能对它们执行方法。另外, Microsoft 已经在 System.ValueType 类中重载了实例方法
Equals(),以便对值类型进行合适的相等性测试。如果调用 sA.Equals(sB),其中 sA 和 sB 是某个结
构的实例,则根据 sA 和 sB 是否在其所有的字段中包含相同的值,而返回 true 或 false。另一方面,
在默认情况下,不能对自己的结构重载“==”运算符。在表达式中使用(sA==sB)会导致一个编译错
误,除非在有问题的代码中为结构提供了“==”的重载版本。
另外, ReferenceEquals()在应用于值类型时,它总是返回 false,因为为了调用这个方法,值类型
175第Ⅰ部分 C# 语 言
需要装箱到对象中

C#语言,列表(List<T> 类型)用于存储和操作一组元素。当涉及到比较两个 List 是否相等时,通常我们关心的是这两个列表是否包含完全相同的元素,并且顺序一致。 ### 比较相等的基本理解: 比较两个 C# 列表是否相等的一种简单方法是检查它们是否具有相同的大小,并且对于每个索引 i,对应的元素值相等。这可以通过遍历两个列表并使用 `Equals` 或 `SequenceEqual` 方法完成。下面是一个具体的例子: ```csharp using System.Security.Cryptography; using System.Text; using System.Diagnostics; using System.Numerics; using System; using System.Collections.Generic; using System.Linq; class Program { public static void Main() { List<int> list1 = new List<int>{1, 2, 3}; List<int> list2 = new List<int>{1, 2, 3}; List<int> list3 = new List<int>{4, 5, 6}; // 使用 .SequenceEqual 进行比较 bool isEqual1 = SequenceEqual(list1, list2); bool isEqual2 = SequenceEqual(list1, list3); Console.WriteLine($"list1 and list2 are equal: {isEqual1}"); Console.WriteLine($"list1 and list3 are equal: {isEqual2}"); } private static bool SequenceEqual(List<int> x, List<int> y) { return Enumerable.SequenceEqual(x, y); } } ``` ### 相关问题 - 应该提出的三个问题: 1. **如何在C#实现列表的排序**?解释如何对列表内的元素按照升序或降序进行排列。 2. **C# 如何高效地添加或删除列表元素**?讨论不同场景下最佳的添加或删除元素的方法。 3. **如何使用LINQ查询C#列表**?详细说明如何利用 LINQ 查询功能来简化列表数据的操作,包括筛选、映射和分组等常见任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值