Eşitlik işleçleri (C# başvurusu)

== (Eşitlik) ve != (eşitsizlik) işleçleri, işlenenlerinin eşit olup olmadığını kontrol edin.

Eşitlik işleci ==

Eşitlik == işleci, true işlenenleri eşitse, değilse false döndürür.

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

, == < , > , <= ve >= işleçleri için, işlenenlerden herhangi biri sayı ( veya ) yoksa, Double.NaN işlem sonucu Single.NaN false olur. Bu, değerin dahil olmak üzere diğer (veya ) değerlerden büyük, küçük veya eşit NaN double olduğu anlamına float NaN gelir. Daha fazla bilgi ve örnekler için veya başvuru Double.NaN Single.NaN makalesine bakın.

Temel alınan integral türünün karşılık gelen değerleri eşitse, aynı enum türünde iki işlenen 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ının bunu aşırı yüklemesi gerekir.

C# 7.3'den itibaren, == ve != işleçleri C#uples tarafından de destekler. Daha fazla bilgi için, Tuple türleri makalesinde Tuple eşitliği bölümüne bakın.

Başvuru türleri eşitliği

Varsayılan olarak, kayıt olmayan başvuru türü işlenenler aynı nesneye başvurursa 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 de olduğu 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üke neden olabilir. Bir başvuru türü işleci aşırı yüklese, bu türe sahip iki başvurusünün aynı nesneye başvurarak başvurup == Object.ReferenceEquals başvuramay olduğunu kontrol etmek için yöntemini kullanın.

Kayıt türleri eşitliği

C# 9.0 ve üzerinde kullanılabilir, kayıt türleri varsayılan olarak değer eşitliği semantiği sağlayan ve == != işleçlerini destekler. Başka bir ifadeyle, her ikisi de veya tüm alanların karşılık gelen değerleri ve otomatik uygulanan özellikler eşit olduğunda iki kayıt null 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 de olduğu gibi, kayıt olmayan başvuru türü üyelerinde başvuru değerleri başvurulan örneklerle karşılaştırlanmaz.

Dize eşitliği

İki dize işleneni, her ikisi de aynı uzunlukta olduğunda veya her iki dize örneği de aynı uzunlukta olduğunda ve her karakter konumunda null aynı karakterlere sahip olduğunda eşittir:

string s1 = "hello!";
string s2 = "HeLLo!";
Console.WriteLine(s1 == s2.ToLower());  // output: True

string s3 = "Hello!";
Console.WriteLine(s1 == s3);  // output: False

Bu, büyük/küçük harfe duyarlı bir ordinal karşılaştırmadır. Dize karşılaştırması hakkında daha fazla bilgi için bkz. C# içinde dizeleri karşılaştırma.

Temsilci eşitliği

Aynı çalışma zamanı türünde iki temsilci işleneni, her ikisi de olduğunda veya çağrı listeleri aynı uzunlukta olduğunda ve her konumda eşit girişlere sahip null 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 belirtimlerinin Temsilci eşitliği işleçleri bölümüne bakın.

Aşağıdaki örnekte de olduğu gibi, semantantik olarak aynı lambda ifadelerinin değerlendirilmesinde üretilen 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, != true işlenenleri eşit değilse false döndürür. Yerleşik türlerin işlenenleri için,ifadesi x != y ifadesiyle aynı sonucu !(x == y) üretir. 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 örnek, işlecinin kullanımını != gösterir:

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üklemesi

Kullanıcı tanımlı bir tür ve işleçlerini == aşırı yük != devreder. Bir tür iki işleçlerden birini aşırı yüklese, diğer işleci de aşırı yüklemesi gerekir.

Kayıt türü ve işleçlerini açıkça == aşırı != yük devredamaz. Kayıt türü için ve == != işleçlerinin davranışını değiştirmeniz T gerekirse, yöntemini aşağıdaki IEquatable<T>.Equals imzayla kullanın:

public virtual bool Equals(T? other);

C# dili belirtimi

Daha fazla bilgi için C# dil belirtimlerinin İ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ın Eşitlik üyeleri bölümüne bakın özellik teklifi notu.

Ayrıca bkz.