📜  c# .equals vs == - C# (1)

📅  最后修改于: 2023-12-03 14:59:39.701000             🧑  作者: Mango

C# .Equals vs ==

在C#中,有两种比较操作符:.Equals==。在某些情况下,它们可能会产生相同的结果,但在其他情况下,它们是不同的。本文将探讨它们的区别与使用场景。

.Equals方法

.Equals.NET中的一个方法,通过它可以比较两个对象是否相等。对于字符串和基本数据类型,.Equals方法会比较他们的值,而对于引用类型,.Equals方法比较的是对象的内存地址。

以下是一个字符串比较的实例代码:

string str1 = "Hello";
string str2 = "Hello";
bool equalStrings = str1.Equals(str2); // 返回true

以下是一个引用类型比较的实例代码:

class Person
{
    public string Name { get; set; }
}

Person person1 = new Person { Name = "Bob" };
Person person2 = new Person { Name = "Bob" };
bool equalPersons = person1.Equals(person2); // 返回false

可以看到,在Person类的.Equals方法中,没有重写该方法,因此默认比较的是对象的地址,所以person1person2被视为不相等。

==操作符

==操作符是一种比较两个对象的快捷方式,它经常用于比较字符串和基本数据类型。在这些情况下,==操作符与.Equals方法产生相同的结果。

以下是一个字符串比较的实例代码:

string str1 = "Hello";
string str2 = "Hello";
bool equalStrings = str1 == str2; // 返回true

以下是一个基本数据类型比较的实例代码:

int x = 1;
int y = 1;
bool equalIntegers = x == y; // 返回true

但是,对于引用类型,==操作符比较的是对象的地址,而不是内容。因此,如果想要比较引用类型的内容,必须重写类的==操作符或.Equals方法。

以下是一个重写类的==操作符的实例代码:

class Person
{
    public string Name { get; set; }

    public static bool operator ==(Person person1, Person person2)
    {
        if (ReferenceEquals(person1, person2))
        {
            return true;
        }

        if (person1 is null || person2 is null)
        {
            return false;
        }

        return person1.Name == person2.Name;
    }

    public static bool operator !=(Person person1, Person person2)
    {
        return !(person1 == person2);
    }
}

Person person1 = new Person { Name = "Bob" };
Person person2 = new Person { Name = "Bob" };
bool equalPersons = person1 == person2; // 返回true

可以看到,在Person类中,重写了==操作符,比较的是对象的内容。因此,person1person2被视为相等。

使用场景

以下是建议的使用场景:

  • 对于引用类型,如果想要比较对象的内容,则使用.Equals方法或重写类的==操作符。
  • 对于字符串和基本数据类型,可以使用.Equals方法或==操作符。对于值类型的比较,推荐使用==操作符。
结论

对于引用类型和值类型,.Equals方法和==操作符的比较方式不同。.Equals方法比较的是对象的内容或值,而==操作符比较的是对象的地址或值。在使用时需要根据具体情况进行选择。