Aracılığıyla paylaş


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.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

is == karşı test ederken bir teste alternatif olarak desen eşleştirme işlecini kullanabilirsiniz. is işleci tüm değer ve başvuru türleri için varsayılan eşitlik semantiğini kullanır.

Eşitlik işleci ==

Eşitlik işleci==, işlenenleri eşitse, true aksi takdirde döndürürfalse.

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 == işleçleri için işlemin sonucu olur<.><=>= Bu koşul, değerin NaN dahil olmak üzere NaNdiğer double (veya ) değerlerden büyük, küçük veya floatbuna eşit olmadığı anlamına gelir. Daha fazla bilgi ve örnek için veya Double.NaN başvuru makalesine Single.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.

C# tanımlama kümeleri ve == için yerleşik desteğe != sahiptir. 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, kayıtlar hariç başvuru türü işlenenler aynı nesneye başvuruda bulunurlarsa 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, başvuru türü üyeleri için başvuru değerleri karşılaştırılır, başvuruda bulunan örnekler karşılaştırılmaz.

Dize eşitliği

her ikisi de aynı uzunlukta olduğunda veya her iki dizenulldize 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

Her ikisi de null aynı uzunlukta olduğunda ve her konumda eşit girişlere sahip olduğunda, aynı çalışma zamanı türündeki iki temsilci işlenen 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

Önemli

Çağırma listesindeki eşit girdiler, alıcı dahil olmak üzere çağrıdaki tüm sabit parametreleri içerir. Alıcı, girdi çağrıldığında tarafından this temsil edilen bir nesnenin örneğidir.

var o1 = new object();
var o2 = new object();
var d1 = o1.ToString;
var d2 = o2.ToString;
Console.WriteLine(object.ReferenceEquals(d1, d2));  // output: False
Console.WriteLine(d1 == d2);  // output: False (different receivers)

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 ifadelerini değerlendirmeden gelen 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 ve false değilse 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şlecinin nasıl kullanılacağı 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ürdeki ve != işleçlerini aşırı yükleyebilirsiniz==. Bu iki işleçlerden birini aşırı yüklerseniz, diğer işleci de aşırı yüklemelisiniz.

Kayıt türündeki == ve != işleçlerini açıkça aşırı yükleyemezsiniz. kayıt türü için ve != işleçlerinin == davranışını değiştirmek için aşağıdaki imzayla yöntemini uygulayınIEquatable<T>.Equals:T

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.

Ayrıca bkz.