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 NaNherhangi 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ü Tiç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.

Ayrıca bkz.