Eşitlik işleçleri - iki nesnenin eşit olup olmadığını test etme
==
(eşitlik) ve !=
(eşitsizlik) işleçleri, işlenenlerinin eşit olup olmadığını denetler. İçerikleri eşit olduğunda değer türleri eşittir. İki değişken aynı depolama alanına başvurduğunda başvuru türleri eşittir.
Eşitlik işleci ==
Eşitlik işleci==
, işlenenleri eşitse, false
aksi takdirde döndürürtrue
.
Değer türleri eşitliği
Yerleşik değer türlerinin işlenenleri, değerleri eşitse eşittir:
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
Not
İşlenenlerden ==
>
<=
<
herhangi biri sayı (Double.NaN veya Single.NaN) değilse , ve >=
işleçleri için işlemin sonucu olur.false
Bu, değerin NaN
dahil olmak üzere NaN
herhangi bir değerden büyük, küçük veya diğer double
(veya float
) değere eşit olmadığı anlamına gelir. Daha fazla bilgi ve örnek için veya Single.NaN başvuru makalesine Double.NaN bakın.
Temel alınan tam sayı türünün karşılık gelen değerleri eşitse, aynı sabit listesi türünün iki işleneni eşittir.
Kullanıcı tanımlı yapı türleri varsayılan olarak işleci desteklemez ==
. İşleci ==
desteklemek için kullanıcı tanımlı bir yapıyı aşırı yüklemesi gerekir.
==
ve !=
işleçleri C# tanımlama kümeleri tarafından desteklenir. Daha fazla bilgi için, Tanımlama grubu türleri makalesinin Tanımlama Grubu eşitliği bölümüne bakın.
Başvuru türleri eşitliği
Varsayılan olarak, aynı nesneye başvuruda bulunan iki kayıt dışı başvuru türü işleneni eşittir:
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
}
}
Örnekte gösterildiği gibi, kullanıcı tanımlı başvuru türleri varsayılan olarak işleci destekler ==
. Ancak, bir başvuru türü işleci aşırı ==
yükleyebilir. Bir başvuru türü işleci aşırı yüklerse ==
, bu türdeki iki başvurunun Object.ReferenceEquals aynı nesneye başvurup başvurmadığını denetlemek için yöntemini kullanın.
Kayıt türleri eşitliği
Kayıt türleri, varsayılan olarak değer eşitliği semantiği sağlayan ve !=
işleçlerini destekler==
. Diğer bir ifadeyle, her ikisi de null
tüm alanların değerleri veya bunlara karşılık gelen değerler olduğunda ve otomatik olarak uygulanan özellikler eşit olduğunda iki kayıt işleneni eşittir.
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
}
}
Yukarıdaki örnekte gösterildiği gibi, kayıt olmayan başvuru türü üyeleri için başvuru değerleri karşılaştırılır, başvurulan örnekler karşılaştırılmaz.
Dize eşitliği
her ikisi de aynı uzunlukta olduğunda veya her iki null
dize örneği de aynı uzunlukta olduğunda ve her karakter konumunda aynı karakterlere sahip olduğunda iki dize işleneni eşittir:
string s1 = "hello!";
string s2 = "HeLLo!";
Console.WriteLine(s1 == s2.ToLower()); // output: True
string s3 = "Hello!";
Console.WriteLine(s1 == s3); // output: False
Dize eşitliği karşılaştırmaları büyük/küçük harfe duyarlı sıralı karşılaştırmalardır. Dize karşılaştırması hakkında daha fazla bilgi için bkz . C# dilinde dizeleri karşılaştırma.
Temsilci eşitliği
Aynı çalışma zamanı türünde iki temsilci işleneni, her ikisi de null
aynı uzunlukta olduğunda veya çağrı listeleri aynı uzunlukta olduğunda ve her konumda eşit girdilere sahip olduğunda eşittir:
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
Daha fazla bilgi için C# dil belirtiminin Temsilci eşitlik işleçleri bölümüne bakın.
Aşağıdaki örnekte gösterildiği gibi, anlamsal olarak özdeş lambda ifadelerinin değerlendirilmesinden oluşturulan temsilciler eşit değildir:
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
Eşitsizlik işleci !=
Eşitsizlik işleci!=
, işlenenleri eşit değilse, false
aksi takdirde döndürürtrue
. Yerleşik türlerin işlenenleri için ifadex != y
, ifadesiyle !(x == y)
aynı sonucu verir. Tür eşitliği hakkında daha fazla bilgi için Eşitlik işleci bölümüne bakın.
Aşağıdaki örnekte işlecin kullanımı gösterilmektedir !=
:
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
İşleç aşırı yüklenebilirliği
Kullanıcı tanımlı bir tür ve işleçlerini ==
aşırı yükleyebilir.!=
Bir tür iki işleçlerden birini aşırı yüklerse, diğerini de aşırı yüklemelidir.
Kayıt türü ve !=
işleçlerini ==
açıkça aşırı yükleyemez. kayıt türü T
için ve !=
işleçlerinin ==
davranışını değiştirmeniz gerekiyorsa aşağıdaki imzayla IEquatable<T>.Equals yöntemini uygulayın:
public virtual bool Equals(T? other);
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminin İlişkisel ve tür testi işleçleri bölümüne bakın.
Kayıt türlerinin eşitliği hakkında daha fazla bilgi için, kayıtlar özellik teklifi notunun Eşitlik üyeleri bölümüne bakın.