Operátory rovnosti – test, jestli jsou dva objekty stejné nebo ne
Operátory ==
(rovnost) a!=
(nerovnosti) kontrolují, jestli jsou jejich operandy stejné nebo ne. Typy hodnot jsou stejné, pokud se jejich obsah rovná. Odkazové typy jsou stejné, když obě proměnné odkazují na stejné úložiště.
Operátor rovnosti ==
Operátor ==
rovnosti vrátí true
, pokud jsou jeho operandy stejné, false
jinak.
Rovnost typů hodnot
Operandy předdefinovaných typů hodnot jsou stejné, pokud jsou jejich hodnoty stejné:
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 >=
operátory, pokud některý z operandů není číslo (Double.NaN nebo Single.NaN), výsledek operace je .false
To znamená, že NaN
hodnota není větší než, menší než, ani rovna žádné jiné double
(nebo float
) hodnotě, včetně NaN
. Další informace a příklady najdete v článku nebo Single.NaN v referenčním Double.NaN článku.
Dva operandy stejného typu výčtu jsou stejné, 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 .
==
Řazené kolekce členů jazyka C# podporují operátory!=
. Další informace najdete v oddílu rovnosti řazené kolekce členů v článku o typech řazených kolekcí členů.
Rovnost typů odkazů
Ve výchozím nastavení jsou dva operandy referenčního typu bez záznamu 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, uživatelem definované odkazové typy podporují ==
operátor ve výchozím nastavení. Typ odkazu však může přetížit ==
operátor. Pokud typ odkazu přetíží ==
operátor, pomocí Object.ReferenceEquals metody zkontrolujte, zda dva odkazy tohoto typu odkazují na stejný objekt.
Rovnost typů záznamů
Typy záznamů podporují operátory ==
, !=
které ve výchozím nastavení poskytují sémantiku rovnosti hodnot. To znamená, že dva operandy záznamů jsou stejné, pokud jsou null
oba nebo odpovídající hodnoty všech polí a 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, pro členy referenčního typu bez záznamu se porovnávají jejich referenční hodnoty, nikoli odkazované instance.
Rovnost řetězců
Dva řetězcové operandy jsou stejné, pokud jsou null
obě nebo obě instance řetězců mají stejnou délku a mají stejné znaky v 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
Porovnání rovnosti řetězců jsou porovnání s rozlišováním malých a velkých písmen. Další informace o porovnání řetězců naleznete v tématu Porovnání řetězců v jazyce C#.
Delegování rovnosti
Dva operandy delegáta stejného typu běhu jsou stejné, pokud jsou null
oba nebo jejich seznamy vyvolání mají stejnou délku a mají stejné položky v každé pozici:
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 naleznete v části Delegovat operátory rovnosti specifikace jazyka C#.
Delegáti vytvořené z vyhodnocení sémanticky identických výrazů lambda se nerovnají, 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í true
, pokud jeho operandy nejsou rovny, false
jinak. Pro operandy předdefinovaných typů výraz x != y
vytvoří stejný výsledek jako výraz !(x == y)
. Další informace o rovnosti typů naleznete 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 !=
operátory. Pokud typ přetíží jeden ze dvou operátorů, musí také přetížit druhý z nich.
Typ záznamu nemůže explicitně přetížit operátory ==
a !=
operátory. Pokud potřebujete změnit chování a !=
operátory ==
pro typ T
záznamu, implementujte metodu IEquatable<T>.Equals s následujícím podpisem:
public virtual bool Equals(T? other);
specifikace jazyka C#
Další informace najdete v části Relační a typové operátory specifikace jazyka C#.
Další informace o rovnosti typů záznamů najdete v části Členové rovnosti v poznámkě k návrhu funkce záznamů.