等號比較運算子 (C# 參考)

== (相等) != (不相等) 運算子會檢查其運算元是否相等。

等號比較運算子 ==

等號比較運算子 == 會在其運算元相等時傳回 true,否則傳回 false

實值型別相等

若他們的值相等時,內建實值型別的運算元就會相等:

int a = 1 + 2 + 3;
int b = 6;
Console.WriteLine(a == b);  // output: True

char c1 = 'a';
char c2 = 'A';
Console.WriteLine(c1 == c2);  // output: False
Console.WriteLine(c1 == char.ToLower(c2));  // output: True

注意

針對 == 、、 < ><=>= 運算子,如果任何運算元不是數位 (Double.NaNSingle.NaN) ,則運算的結果為 false 。 這代表 NaN 的值皆不會大於、小於或等於任何其他 double (或 float) 的值,包括 NaN。 如需詳細資訊和範例,請參閱 Double.NaNSingle.NaN 參考文章。

若基礎整數型別的對應值相等時,相同列舉類型的兩個運算元就會相等。

使用者定義結構型別預設不支援 == 運算子。 若要支援 == 運算子,使用者定義結構必須多載它。

從 C# 7.3 說起,==!= 運算子是由 C# tuples 所支援。 如需詳細資訊,請參閱元組類型一文的元組相等區段。

參考型別相等

根據預設,如果兩個非記錄的參考型別運算元參考相同的物件,就會相等:

public class ReferenceTypesEquality
{
    public class MyClass
    {
        private int id;

        public MyClass(int id) => this.id = id;
    }

    public static void Main()
    {
        var a = new MyClass(1);
        var b = new MyClass(1);
        var c = a;
        Console.WriteLine(a == b);  // output: False
        Console.WriteLine(a == c);  // output: True
    }
}

如範例所示,使用者定義參考型別預設支援 == 運算子。 不過,參考型別可以多載 == 運算子。 若參考型別多載 == 運算子,請使用 Object.ReferenceEquals 方法檢查兩個該類型的參考是否參考相同的物件。

記錄類型相等

在 c # 9.0 和更新版本中提供, 記錄類型 支援 ==!= 運算子,這些運算子預設會提供值相等的語法。 也就是說,當兩個記錄運算元都是 null 或所有欄位的對應值,且自動執行的屬性相等時,兩個記錄運算元相等。

public class RecordTypesEquality
{
    public record Point(int X, int Y, string Name);
    public record TaggedNumber(int Number, List<string> Tags);

    public static void Main()
    {
        var p1 = new Point(2, 3, "A");
        var p2 = new Point(1, 3, "B");
        var p3 = new Point(2, 3, "A");

        Console.WriteLine(p1 == p2);  // output: False
        Console.WriteLine(p1 == p3);  // output: True

        var n1 = new TaggedNumber(2, new List<string>() { "A" });
        var n2 = new TaggedNumber(2, new List<string>() { "A" });
        Console.WriteLine(n1 == n2);  // output: False
    }
}

如先前的範例所示,如果是非記錄的參考型別成員,則會比較其參考值,而不是參考的實例。

字串相等

當兩個 string 運算元皆為 null,或兩個 string 執行個體的長度相同且在各字元位置擁有完全相同的字元,兩者就會相等:

string s1 = "hello!";
string s2 = "HeLLo!";
Console.WriteLine(s1 == s2.ToLower());  // output: True

string s3 = "Hello!";
Console.WriteLine(s1 == s3);  // output: False

這是區分大小寫的序數比較。 如需有關字串比較的詳細資訊,請參閱如何在 C# 中比較字串

委派等號

當兩個 委派 運算元都是 null 或其調用清單的長度相同,且每個位置都有相等的專案時,兩個相同執行時間類型的委派運算元相等:

Action a = () => Console.WriteLine("a");

Action b = a + a;
Action c = a + a;
Console.WriteLine(object.ReferenceEquals(b, c));  // output: False
Console.WriteLine(b == c);  // output: True

如需詳細資訊,請參閱 C# 語言規格委派相等運算子一節。

從語意相同之 lambda 運算式之評估產生的委派不相等,如下列範例所示:

Action a = () => Console.WriteLine("a");
Action b = () => Console.WriteLine("a");

Console.WriteLine(a == b);  // output: False
Console.WriteLine(a + b == a + b);  // output: True
Console.WriteLine(b + a == a + b);  // output: False

不等比較運算子 !=

不等比較運算子 != 會在其運算元不相等時傳回 true,否則傳回 false。 對於內建類型的運算元,運算式 x != y 會產生與運算式 !(x == y) 相同的結果。 如需有關型別等號的詳細資訊,請參閱等號比較運算子一節。

下列範例示範 != 運算子的用法:

int a = 1 + 1 + 2 + 3;
int b = 6;
Console.WriteLine(a != b);  // output: True

string s1 = "Hello";
string s2 = "Hello";
Console.WriteLine(s1 != s2);  // output: False

object o1 = 1;
object o2 = 1;
Console.WriteLine(o1 != o2);  // output: True

運算子是否可多載

使用者定義類型可以多載==!= 運算子。 如果類型多載這兩個運算子之一,它也必須多載另一個運算子。

記錄類型無法明確地多載 == and != 運算子。 如果您需要變更 == 記錄類型之和運算子的行為 != T ,請使用下列簽章來執行 IEquatable<T>.Equals 方法:

public virtual bool Equals(T? other);

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格關係及類型測試運算子一節。

如需記錄類型是否相等的詳細資訊,請參閱記錄功能提案附注相等成員一節。

另請參閱