Gelijkheidsoperators: testen of twee objecten gelijk zijn of niet
De ==
operators (gelijkheid) en!=
(ongelijkheid) controleren of hun operanden gelijk zijn of niet. Waardetypen zijn gelijk wanneer de inhoud gelijk is. Verwijzingstypen zijn gelijk wanneer de twee variabelen naar dezelfde opslag verwijzen.
Gelijkheidsoperator ==
De gelijkheidsoperator retourneert ==
true
als de operanden gelijk zijn, false
anders.
Gelijkheid van waardetypen
Operanden van de ingebouwde waardetypen zijn gelijk als de waarden gelijk zijn:
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
Notitie
Als een van de operanden geen getal (of) is, is false
het resultaat van de bewerking voor de >
<=
<
>=
==
operatoren , en operatoren .Single.NaNDouble.NaN Dit betekent dat de NaN
waarde niet groter is dan, kleiner dan, noch gelijk is aan een andere double
(of float
) waarde, met inbegrip NaN
van . Zie het Double.NaN artikel of Single.NaN naslaginformatie voor meer informatie en voorbeelden.
Twee operanden van hetzelfde enumtype zijn gelijk als de bijbehorende waarden van het onderliggende integrale type gelijk zijn.
Door de gebruiker gedefinieerde structtypen ondersteunen de ==
operator niet standaard. Om de operator te ondersteunen, moet een door de ==
gebruiker gedefinieerde struct deze overbelasten.
De ==
en !=
operators worden ondersteund door C# -tuples. Zie de sectie Tuple-gelijkheid van het artikel Tuple-typen voor meer informatie.
Gelijkheid van verwijzingstypen
Standaard zijn twee niet-recordverwijzingstype operanden gelijk als ze naar hetzelfde object verwijzen:
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
}
}
Zoals in het voorbeeld wordt weergegeven, ondersteunen door de gebruiker gedefinieerde referentietypen de ==
operator standaard. Een verwijzingstype kan de ==
operator echter overbelasten. Als een verwijzingstype de ==
operator overbelast, gebruikt u de Object.ReferenceEquals methode om te controleren of twee verwijzingen van dat type naar hetzelfde object verwijzen.
Gelijkheid van recordtypen
Recordtypen ondersteunen de ==
en !=
operators die standaard semantiek voor gelijkheid van waarden bieden. Dat wil gezegd: twee recordoperanden zijn gelijk wanneer beide waarden of null
overeenkomende waarden van alle velden zijn en automatisch geïmplementeerde eigenschappen gelijk zijn.
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
}
}
Zoals in het voorgaande voorbeeld wordt weergegeven, worden voor niet-recordverwijzingstypeleden hun referentiewaarden vergeleken, niet de exemplaren waarnaar wordt verwezen.
Gelijkheid van tekenreeksen
Twee tekenreeksoperanden zijn gelijk wanneer beide tekenreeksexemplaren of null
beide tekenreeksexemplaren dezelfde lengte hebben en identieke tekens hebben in elke tekenpositie:
string s1 = "hello!";
string s2 = "HeLLo!";
Console.WriteLine(s1 == s2.ToLower()); // output: True
string s3 = "Hello!";
Console.WriteLine(s1 == s3); // output: False
Vergelijkingen voor gelijkheid van tekenreeksen zijn hoofdlettergevoelige ordinale vergelijkingen. Zie Tekenreeksen vergelijken in C# voor meer informatie over tekenreeksvergelijking.
Gelijkheid delegeren
Twee operanden van hetzelfde uitvoeringstype zijn gelijk wanneer beide of null
hun aanroeplijsten dezelfde lengte hebben en gelijke vermeldingen hebben op elke positie:
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
Zie de sectie Gelijkheidsoperatoren delegeren van de C#-taalspecificatie voor meer informatie.
Gemachtigden die zijn geproduceerd door de evaluatie van semantisch identieke lambda-expressies zijn niet gelijk, zoals in het volgende voorbeeld wordt weergegeven:
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
Ongelijkheidsoperator !=
De ongelijkheidsoperator !=
retourneert true
als de operanden niet gelijk zijn, false
anders. Voor de operanden van de ingebouwde typen produceert de expressie x != y
hetzelfde resultaat als de expressie !(x == y)
. Zie de sectie Gelijkheidsoperator voor meer informatie over type gelijkheid.
In het volgende voorbeeld ziet u het gebruik van de !=
operator:
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
Overbelasting van operatoren
Een door de gebruiker gedefinieerd type kan de ==
en !=
operators overbelasten. Als een type een van de twee operators overbelast, moet het ook de andere overbelasting.
Een recordtype kan de ==
en !=
operators niet expliciet overbelasten. Als u het gedrag van het ==
recordtype en !=
de operators voor recordtype T
wilt wijzigen, implementeert u de IEquatable<T>.Equals methode met de volgende handtekening:
public virtual bool Equals(T? other);
C#-taalspecificatie
Zie de sectie Relationele operators en typetests van de C#-taalspecificatie voor meer informatie.
Zie de sectie Gelijkheidsleden van de notitie voor het voorstel voor records voor meer informatie over gelijkheid van recordtypen.