相等性比较 (C# 编程指南)

有时有必要比较两个值是否相等。 在某些情况下,要测试 值相等性,也称为 等价性,这意味着两个变量包含的值相等。 在其他情况下,必须确定两个变量是否引用内存中的同一基础对象。 这种类型的 相等性称为引用相等性标识。 本主题介绍这两种类型的相等性,并提供指向其他主题的链接以获取详细信息。

引用相等性

引用相等意味着两个对象引用引用同一基础对象。 这可以通过简单的分配进行,如以下示例所示。

using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    public static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
    }
}

在此代码中,将创建两个对象,但在赋值语句之后,两个引用都引用同一对象。 因此,它们具有引用相等性。 ReferenceEquals使用该方法确定两个引用是否引用同一对象。

引用相等的概念仅适用于引用类型。 值类型对象不能具有引用相等性,因为当向变量赋值类型的实例时,将创建值的副本。 因此,永远不会有两个未装箱结构引用内存中的同一位置。 此外,如果使用 ReferenceEquals 比较两个值类型,则结果将始终相同 false,即使对象中包含的值都是相同的。 这是因为每个变量都装箱到单独的对象实例中。 有关详细信息,请参阅如何测试引用相等性(标识)

值相等性

值相等意味着两个对象包含相同的值或值。 对于 intbool 等基元值类型,值相等测试非常简单。 可以使用 == 运算符,如以下示例所示。

int a = GetOriginalValue();  
int b = GetCurrentValue();  
  
// Test for value equality.
if (b == a)
{  
    // The two integers are equal.  
}  

对于大多数其他类型,测试值的相等性更为复杂,因为这需要你了解这个类型是如何定义相等性的。 对于具有多个字段或属性的类和结构,值相等性通常定义为表示所有字段或属性具有相同的值。 例如,如果 pointA.X 等于 pointB.X 且 pointA.Y 等于 pointB.Y,则两个 Point 对象可能定义为等效对象。 对于记录,值相等意味着如果类型匹配且所有属性和字段值匹配,则记录类型的两个变量相等。

但是,没有要求等效性依赖于类型中的所有字段。 它可以基于子集。 比较自己不拥有的类型时,应确保明确了解该类型是如何定义等效性的。 有关如何在自己的类和结构中定义值相等性的详细信息,请参阅 如何定义类型的值相等性

浮点值的值相等性

浮点值(doublefloat)的等值比较存在问题,因为二进制计算机上的浮点算术不精确。 有关详细信息,请参阅主题 System.Double中的备注。

标题 DESCRIPTION
如何测试引用相等性(标识) 介绍如何确定两个变量是否具有引用相等性。
如何为类型定义值相等性 介绍如何为类型提供值相等性的自定义定义。
类型 提供有关 C# 类型系统的信息以及指向其他信息的链接。
记录 提供关于记录类型的信息,这些类型默认情况下会测试值的相等性。