Operátory rovnosti (referenční informace jazyka C#)
Operátory == (rovnost) a != (nerovnost) kontrolují, jestli jsou jejich operandy stejné nebo ne.
Operátor rovnosti ==
Operátor rovnosti vrátí == hodnotu , pokud jsou jeho true operandy stejné, false jinak.
Rovnost typů hodnot
Operandy předdefinových hodnotových typů jsou shodné, pokud se jejich hodnoty rovnají:
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
Poznámka
Pro == < operátory > <= >= , , , a , pokud některý z operandů není číslo ( nebo ), je výsledkem Double.NaN operace Single.NaN false . To znamená, že hodnota není větší než, menší než ani rovna žádné NaN jiné double hodnotě (nebo ), včetně float NaN . Další informace a příklady najdete v článku Double.NaN nebo Single.NaN v referenčních informacích.
Dva operandy stejného typu výčtu jsou shodné, pokud jsou odpovídající hodnoty základního celočíselného typu stejné.
Uživatelem definované typy struktur ve výchozím nastavení operátor == nepodporují. Pro podporu == operátoru musí uživatelem definovaná struktura přetížit.
Počínaje jazykem C# 7.3 jsou operátory a podporovány řazenou kolekcemi členů == != jazyka C#. Další informace najdete v části Rovnost řazené kolekce členů v článku Typy řazené kolekce členů.
Rovnost typů odkazů
Ve výchozím nastavení jsou dva ne record operandy odkazového typu stejné, pokud odkazují na stejný objekt:
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
}
}
Jak ukazuje příklad, odkazové typy definované uživatelem ve výchozím nastavení == podporují operátor . Odkazový typ však může přetížit == operátor . Pokud odkazový typ přetíží operátor, pomocí metody zkontrolujte, jestli dva odkazy tohoto typu == Object.ReferenceEquals odkazují na stejný objekt.
Rovnost typů záznamů
Typy záznamů dostupné v jazyce C# 9.0 a novějším podporují operátory a , které ve výchozím nastavení poskytují == != sémantiku rovnosti hodnot. To znamená, že dva operandy záznamů jsou shodné, pokud jsou oba dva nebo odpovídající hodnoty všech polí a null automaticky implementované vlastnosti jsou stejné.
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
}
}
Jak ukazuje předchozí příklad, v případě členů referenčního typu bez záznamu se porovnávají jejich referenční hodnoty, nikoli odkazované instance.
Rovnost řetězce
Dva řetězcové operandy jsou shodné, pokud jsou oba nebo obě instance řetězce mají stejnou délku a mají identické null znaky na každé pozici znaku:
string s1 = "hello!";
string s2 = "HeLLo!";
Console.WriteLine(s1 == s2.ToLower()); // output: True
string s3 = "Hello!";
Console.WriteLine(s1 == s3); // output: False
To je ordinální porovnání rozlišují malá a velká písmena. Další informace o porovnání řetězců najdete v tématu Porovnání řetězců v jazyce C#.
Delegování rovnosti
Dva operandy delegáta stejného typu za běhu jsou shodné, pokud jsou oba dva nebo jejich seznamy volání mají stejnou délku a mají na každé pozici stejné null položky:
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
Další informace najdete v části Delegování operátorů rovnosti specifikace jazyka C#.
Delegáti, kteří jsou vytvořeni vyhodnocením sémanticky identických výrazů lambda, nejsou si rovni, jak ukazuje následující příklad:
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
Operátor nerovnosti !=
Operátor nerovnosti vrátí != hodnotu , pokud se jeho true operandy nerovnají, false jinak. Pro operandy předdefinových typůvytvoří výraz stejný x != y výsledek jako výraz !(x == y) . Další informace o rovnosti typů najdete v části Operátor rovnosti.
Následující příklad ukazuje použití != operátoru :
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
Přetížení operátoru
Uživatelem definovaný typ může přetížit == operátory != a . Pokud typ přetíží jeden ze dvou operátorů, musí také přetížit druhý.
Typ záznamu nemůže explicitně přetížit == operátory != a . Pokud potřebujete změnit chování operátorů a pro == != typ záznamu , T implementujte IEquatable<T>.Equals metodu s následujícím podpisem:
public virtual bool Equals(T? other);
specifikace jazyka C#
Další informace najdete v části Relační operátory a operátory pro testování typů specifikace jazyka C#.
Další informace o rovnosti typů záznamů najdete v části Členové rovnosti v poznámce k návrhu záznamů.