Karşılaştırma İşleçlerini Aşırı Yükleme
==, != ve sıralama işleçlerini uygulayın.
Karşılaştırma İşleçlerini Aşırı Yükleme, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Karşılaştırma İşleçleri ve Eşitlik
== işleçini aşırı yüklediğinizde != işleçini de aşırı yüklemeniz gerekir; ayrıca tüm eşitlik biçimlerini tutarlı tutmak için Equals ve GetHashCode yöntemlerini geçersiz kılmalısınız. C#, işleç çiftlerinin derleme zamanında tanımlanmasını zorunlu kılar.
== ve != İşleçlerini Aşırı Yükleme
Derleyici, == ve != işleçlerinin birlikte tanımlanmasını zorunlu kılar. Her biri, işlenenlerin eşit kabul edilip edilmediğini belirten bir bool döndürür.
using System;
public struct Point
{
public int X, Y;
public Point(int x, int y) { X = x; Y = y; }
public static bool operator ==(Point a, Point b) => a.X == b.X && a.Y == b.Y;
public static bool operator !=(Point a, Point b) => !(a == b);
public override bool Equals(object obj) => obj is Point p && this == p;
public override int GetHashCode() => HashCode.Combine(X, Y);
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Point(1, 2) == new Point(1, 2));
Console.WriteLine(new Point(1, 2) != new Point(3, 4));
}
}Equals'i de Her Zaman Geçersiz Kılınız
İşleçler derleme zamanında statik türe göre çözümlenir, ancak Equals sanaldır ve koleksiyonlar tarafından kullanılır. Sözlüklerin ve List.Contains işleminin == ile uyumlu olması için Equals yöntemini geçersiz kılınız.
using System;
public struct Point
{
public int X, Y;
public Point(int x, int y) { X = x; Y = y; }
public static bool operator ==(Point a, Point b) => a.X == b.X && a.Y == b.Y;
public static bool operator !=(Point a, Point b) => !(a == b);
public override bool Equals(object obj) => obj is Point p && this == p;
public override int GetHashCode() => HashCode.Combine(X, Y);
}
public class Program
{
public static void Main()
{
object a = new Point(1, 2);
object b = new Point(1, 2);
Console.WriteLine(a.Equals(b));
}
}GetHashCode Eşitlikle Uyuşmalıdır
İki değer eşitse aynı karma kodunu döndürmelidir. Aksi durumda Dictionary ve HashSet gibi karma tabanlı koleksiyonlar hatalı çalışır.
using System;
using System.Collections.Generic;
public struct Point
{
public int X, Y;
public Point(int x, int y) { X = x; Y = y; }
public static bool operator ==(Point a, Point b) => a.X == b.X && a.Y == b.Y;
public static bool operator !=(Point a, Point b) => !(a == b);
public override bool Equals(object obj) => obj is Point p && this == p;
public override int GetHashCode() => HashCode.Combine(X, Y);
}
public class Program
{
public static void Main()
{
var set = new HashSet<Point> { new Point(1, 2) };
Console.WriteLine(set.Contains(new Point(1, 2)));
}
}< ve > Sıralama İşleçleri
İlişkisel işleçleri de aşırı yükleyebilirsiniz. Eşitlikte olduğu gibi < ve > birlikte tanımlanmalıdır; aynı şekilde <= ve >= de birlikte tanımlanmalıdır.
using System;
public struct Weight
{
public int Grams;
public Weight(int g) { Grams = g; }
public static bool operator <(Weight a, Weight b) => a.Grams < b.Grams;
public static bool operator >(Weight a, Weight b) => a.Grams > b.Grams;
public override string ToString() => Grams + "g";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Weight(100) < new Weight(200));
Console.WriteLine(new Weight(300) > new Weight(200));
}
}Başvuru Türlerinde Eşitlik
Sınıflarda değer eşitliği, başvuruları değil alanları karşılaştırmak anlamına gelir. İşlecin içinde hata oluşmasını önlemek için null değerini dikkatle ele alınız.
using System;
public class Person
{
public string Name;
public Person(string name) { Name = name; }
public static bool operator ==(Person a, Person b)
{
if (ReferenceEquals(a, b)) return true;
if (a is null || b is null) return false;
return a.Name == b.Name;
}
public static bool operator !=(Person a, Person b) => !(a == b);
public override bool Equals(object obj) => this == (obj as Person);
public override int GetHashCode() => Name?.GetHashCode() ?? 0;
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Person("Ann") == new Person("Ann"));
}
}Biçimler Arasında Tutarlılık
Tüm eşitlik yolları aynı sonucu vermelidir: ==, Equals ve karma kodu. Tek bir doğruluk kaynağı olması için == işleçini Equals temelinde (veya tersini) uygulayınız.
using System;
public struct Id
{
public int Value;
public Id(int value) { Value = value; }
public bool Equals(Id other) => Value == other.Value;
public override bool Equals(object obj) => obj is Id other && Equals(other);
public override int GetHashCode() => Value;
public static bool operator ==(Id a, Id b) => a.Equals(b);
public static bool operator !=(Id a, Id b) => !a.Equals(b);
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Id(7) == new Id(7));
Console.WriteLine(new Id(7).Equals(new Id(8)));
}
}Koleksiyonlarda İşleçler ve Equals
Liste araması == yerine Equals kullanır; çünkü object başvurularıyla çalışır. Yalnızca == işleçini aşırı yükleyip Equals yöntemini unutursanız aramalar başvuru kimliğini kullanır ve başarısız olabilir.
using System;
using System.Collections.Generic;
public struct Tag
{
public string Name;
public Tag(string name) { Name = name; }
public override bool Equals(object obj) => obj is Tag t && t.Name == Name;
public override int GetHashCode() => Name?.GetHashCode() ?? 0;
public static bool operator ==(Tag a, Tag b) => a.Equals(b);
public static bool operator !=(Tag a, Tag b) => !a.Equals(b);
}
public class Program
{
public static void Main()
{
var list = new List<Tag> { new Tag("red"), new Tag("blue") };
Console.WriteLine(list.Contains(new Tag("blue")));
}
}Derleyici Uyarılarını Doğru Şekilde Bastırma
Equals ve GetHashCode yöntemlerini işleçlerle birlikte geçersiz kılmak yalnızca bir nezaket değildir; Equals yöntemini geçersiz kılmadan == işleçini aşırı yüklerseniz derleyici uyarır. İkisini de yapmak uyarıyı kaldırır ve hataları önler.
using System;
public struct Cell
{
public int Row, Col;
public Cell(int r, int c) { Row = r; Col = c; }
public override bool Equals(object obj) => obj is Cell c && c.Row == Row && c.Col == Col;
public override int GetHashCode() => HashCode.Combine(Row, Col);
public static bool operator ==(Cell a, Cell b) => a.Equals(b);
public static bool operator !=(Cell a, Cell b) => !a.Equals(b);
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Cell(0, 0) == new Cell(0, 0));
}
}Hepsini Bir Araya Getirme
İyi tasarlanmış, eşitlenebilir bir tür == ve != işleçlerini tanımlar, Equals ve GetHashCode yöntemlerini geçersiz kılar ve bunların tümünü tek bir karşılaştırma üzerinden yönlendirir. Bu, değer türleri için altın standarttır.
using System;
using System.Collections.Generic;
public struct Color
{
public int R, G, B;
public Color(int r, int g, int b) { R = r; G = g; B = b; }
public override bool Equals(object obj) => obj is Color c && c.R == R && c.G == G && c.B == B;
public override int GetHashCode() => HashCode.Combine(R, G, B);
public static bool operator ==(Color a, Color b) => a.Equals(b);
public static bool operator !=(Color a, Color b) => !a.Equals(b);
}
public class Program
{
public static void Main()
{
var dict = new Dictionary<Color, string> { [new Color(255, 0, 0)] = "red" };
Console.WriteLine(dict[new Color(255, 0, 0)]);
}
}Kendiniz Deneyiniz
Tamamen tutarlı, eşitlenebilir bir yapı türü uygulayınız ve bunun hem sözlük anahtarı hem de == işleciyle aynı anda çalıştığını doğrulayınız.
using System;
using System.Collections.Generic;
public struct GridPos
{
public int Row, Col;
public GridPos(int r, int c) { Row = r; Col = c; }
public override bool Equals(object obj) => obj is GridPos p && p.Row == Row && p.Col == Col;
public override int GetHashCode() => HashCode.Combine(Row, Col);
public static bool operator ==(GridPos a, GridPos b) => a.Equals(b);
public static bool operator !=(GridPos a, GridPos b) => !a.Equals(b);
}
public class Program
{
public static void Main()
{
var grid = new Dictionary<GridPos, string> { [new GridPos(1, 1)] = "player" };
Console.WriteLine(new GridPos(1, 1) == new GridPos(1, 1));
Console.WriteLine(grid[new GridPos(1, 1)]);
}
}Hızlı Kontrol
Eşitlik işleçlerini aşırı yükleme kurallarını hatırlayınız.
Özet
Karşılaştırma işleçlerini aşırı yüklemek tutarlılık gerektirir.
==ve!=birlikte tanımlanmalıdır; aynı durum</>için de geçerlidir.==ile uyumlu olması içinEqualsveGetHashCodeyöntemlerini geçersiz kılınız.- Eşit değerler aynı karma kodunu paylaşmalıdır.
- Tutarsızlık oluşmasını önlemek için tüm eşitlik işlemlerini tek bir karşılaştırma yöntemine yönlendiriniz.
Sıkça Sorulan Sorular
“Karşılaştırma İşleçlerini Aşırı Yükleme” dersi ücretsiz mi?
Evet — “Karşılaştırma İşleçlerini Aşırı Yükleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Karşılaştırma İşleçlerini Aşırı Yükleme” dersinde ne öğreneceğim?
==, != ve sıralama işleçlerini uygulayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Karşılaştırma İşleçlerini Aşırı Yükleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Aritmetik İşleçleri Aşırı Yükleme
- Karşılaştırma İşleçlerini Aşırı Yükleme
- Kullanıcı Tanımlı Dönüşümler
- İşleç Aşırı Yükleme için En İyi Uygulamalar