相等運算子 - 測試兩個物件相等或不相等
==
(相等) 和 !=
(不等) 運算子可檢查其運算元是否相等。 實值型別在內容相等時相等。 兩個變數參考相同的儲存體時,參考型別會相等。
等號比較運算子 ==
等號比較運算子 ==
會在其運算元相等時傳回 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.NaN 或 Single.NaN),則作業的結果是 false
。 這代表 NaN
的值皆不會大於、小於或等於任何其他 double
(或 float
) 的值,包括 NaN
。 如需詳細資訊和範例,請參閱 Double.NaN 或 Single.NaN 參考文章。
若基礎整數型別的對應值相等時,相同列舉類型的兩個運算元就會相等。
使用者定義結構型別預設不支援 ==
運算子。 若要支援 ==
運算子,使用者定義結構必須多載它。
==
及 !=
運算子是由 C# tuples 所支援。 如需詳細資訊,請參閱 Tuple 型別一文中的 Tuple 相等一節。
參考型別相等
根據預設,兩個非記錄參考型別的運算元參考相同物件時,兩者就相等:
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 方法檢查兩個該類型的參考是否參考相同的物件。
記錄型別相等
記錄型別預設支援 ==
和 !=
運算子,以提供值相等語意。 也就是說,當兩個記錄操作數都是 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
從語意相同 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
運算子是否可多載
使用者定義類型可以多載==
和 !=
運算子。 如果某個型別多載這兩個運算子之一,它也必須多載另一個運算子。
記錄型別無法明確多載 ==
和 !=
運算子。 如果您需要變更記錄型別 T
的 ==
和 !=
運算子行為,請使用下列特徵標記實作 IEquatable<T>.Equals 方法:
public virtual bool Equals(T? other);
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的關係及類型測試運算子一節。
如需記錄型別相等的詳細資訊,請參閱記錄功能提案附註的相等成員一節。