6.C#双等于运算符和Equals的区别

  1. 6.CSharp中双等于运算符和Equals的区别
    1. 6.1 题目
    2. 6.2 深入解析
      1. 示例代码
      2. 总结
    3. 6.3 答题示例
    4. 6.4 关键词联想

6.CSharp中双等于运算符和Equals的区别


6.1 题目

请说说你认为C#中 == 和 Equals 的区别是什么?


6.2 深入解析

在C#中,==Equals 是用于比较对象的两种不同方式。

  1. 定义和重写

    • == 是一个运算符,用于比较两个操作数。
    • EqualsObject 类中的虚方法,可以在子类中重写。
  2. 比较方式

    • Equals 方法一般用于比较两个对象的内容是否相同。默认情况下,Object 类中的 Equals 方法比较对象的引用,即判断两个对象是否是同一个实例。子类可以重写 Equals 方法以实现特定的比较逻辑。
    • == 对值类型通常比较按位值;对引用类型默认比较引用,但部分类型(如 string)重载了 ==,行为与内容比较一致。
  3. 运算效率

    • 一般情况下,Equals 方法的效率没有 == 运算符高,因为 Equals 方法通常会进行更多的比较操作。尤其是在子类中重写 Equals 方法时,可能会比较对象的各个字段,而 == 运算符通常进行简单的引用或值比较。

示例代码

using System;

class Program
{
    static void Main()
    {
        // 示例1:值类型比较
        int a = 5;
        int b = 5;
        Console.WriteLine(a == b);      // 输出:True
        Console.WriteLine(a.Equals(b)); // 输出:True

        // 示例2:string 的 == 已重载为按内容比较(与 Equals 一致)
        string str1 = new string(new[] { 'h', 'e', 'l', 'l', 'o' });
        string str2 = new string(new[] { 'h', 'e', 'l', 'l', 'o' });
        Console.WriteLine(str1 == str2);       // True(内容相同)
        Console.WriteLine(str1.Equals(str2));  // True
        // 引用是否同一实例用 ReferenceEquals
        Console.WriteLine(object.ReferenceEquals(str1, str2)); // 通常为 False

        // 示例3:自定义类比较
        MyClass obj1 = new MyClass(1, "example");
        MyClass obj2 = new MyClass(1, "example");
        Console.WriteLine(obj1 == obj2);      // 输出:False,因为==比较的是引用地址
        Console.WriteLine(obj1.Equals(obj2)); // 输出:True,因为重写的Equals方法比较的是内容
    }
}

class MyClass
{
    public int Id { get; }
    public string Name { get; }

    public MyClass(int id, string name)
    {
        Id = id;
        Name = name;
    }

    public override bool Equals(object obj)
    {
        if (obj is MyClass other)
        {
            return Id == other.Id && Name == other.Name;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode() ^ Name.GetHashCode();
    }
}

总结

  • 定义和重写

    • == 是运算符,EqualsObject 类中的虚方法,子类可以重写。
  • 比较方式

    • Equals 方法通常用于比较对象的内容,== 运算符用于比较引用类型的地址或值类型的值。
  • 运算效率

    • == 运算符通常比 Equals 方法效率高,因为 Equals 方法可能涉及更多的比较操作。

6.3 答题示例

== 对值类型比较值;对引用类型默认比较引用,但 string 等类型重载了 ==,按内容比较。Equals 为虚方法,默认引用相等,子类常重写为值相等;重写 Equals 时需同步 GetHashCode。”


6.4 关键词联想

  • == 运算符

    • 值类型:值比较
    • 引用类型:地址比较
    • 可重载
  • Equals 方法

    • 虚方法
    • 内容比较
    • 重写 & GetHashCode
  • 性能考量

    • 运算符更高效
    • 方法可能更复杂


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏