IEquatable Uygulama
Equals ile tür güvenli eşitlik sağlayın.
IEquatable Uygulama, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. 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.
IEquatable<T> Neden?
IEquatable<T>, güçlü tür denetimli bir Equals(T other) yöntemi sağlar. Değer türlerinde kutulamayı, başvuru türlerinde tür dönüştürmesini önleyerek eşitliği hem daha hızlı hem de daha anlaşılır hale getirir.
Arabirimi Uygulama
IEquatable<T> arabirimini uygulayın ve Equals(T other) sağlayın. Tüm yolları tutarlı tutmak için devralınan object.Equals ve GetHashCode yöntemlerini de geçersiz kılmalısınız.
using System;
public struct Point : IEquatable<Point>
{
public int X, Y;
public Point(int x, int y) { X = x; Y = y; }
public bool Equals(Point other) => X == other.X && Y == other.Y;
public override bool Equals(object obj) => obj is Point p && Equals(p);
public override int GetHashCode() => HashCode.Combine(X, Y);
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Point(1, 2).Equals(new Point(1, 2)));
}
}Yapılarda Kutulamadan Kaçınma
Genel olmayan object.Equals(object), bir yapı bağımsız değişkenini kutular. IEquatable<T> arabiriminden gelen türü belirtilmiş Equals(Point other), yapıyı doğrudan alır; bu nedenle bellek ayırma gerçekleşmez.
using System;
public struct Point : IEquatable<Point>
{
public int X, Y;
public Point(int x, int y) { X = x; Y = y; }
public bool Equals(Point other) => X == other.X && Y == other.Y; // no boxing
public override bool Equals(object obj) => obj is Point p && Equals(p);
public override int GetHashCode() => HashCode.Combine(X, Y);
}
public class Program
{
public static void Main()
{
Point a = new Point(3, 4);
Point b = new Point(3, 4);
Console.WriteLine(a.Equals(b)); // calls the typed overload
}
}Koleksiyonlar IEquatable<T> Kullanır
List<T>.Contains, Dictionary ve HashSet, kullanılabildiğinde IEquatable<T>.Equals yöntemini tercih eder. Bunu uygulamak, bu işlemlerin türünüz için verimli ve doğru olmasını sağlar.
using System;
using System.Collections.Generic;
public struct Point : IEquatable<Point>
{
public int X, Y;
public Point(int x, int y) { X = x; Y = y; }
public bool Equals(Point other) => X == other.X && Y == other.Y;
public override bool Equals(object obj) => obj is Point p && Equals(p);
public override int GetHashCode() => HashCode.Combine(X, Y);
}
public class Program
{
public static void Main()
{
var list = new List<Point> { new Point(0, 0), new Point(1, 1) };
Console.WriteLine(list.Contains(new Point(1, 1)));
}
}Başvuru Türleri ve IEquatable<T>
Sınıflar da IEquatable<T> arabirimini uygulayabilir. Türü belirtilmiş Equals bir tür dönüştürmesini önler; başvuru parametresindeki null değerini açıkça ele alırsınız.
using System;
public class Person : IEquatable<Person>
{
public string Name;
public Person(string name) { Name = name; }
public bool Equals(Person other) => other != null && other.Name == Name;
public override bool Equals(object obj) => Equals(obj as Person);
public override int GetHashCode() => Name?.GetHashCode() ?? 0;
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Person("Ada").Equals(new Person("Ada")));
Console.WriteLine(new Person("Ada").Equals((Person)null));
}
}object.Equals'i Türü Belirtilmiş Yöntem Üzerinden Yönlendirme
Temiz bir yaklaşım, karşılaştırmayı Equals(T) içinde bir kez yazıp object.Equals yönteminin bunu çağırmasını sağlamaktır. Böylece ikisinin de aynı şekilde davranması garanti edilir.
using System;
public struct Id : IEquatable<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 class Program
{
public static void Main()
{
object boxed = new Id(5);
Console.WriteLine(boxed.Equals(new Id(5)));
}
}Birden Çok Alanı Karşılaştırma
Birden çok alanı olan türlerde bunların tümünü Equals içinde karşılaştırın. İki örnek, yalnızca ilgili her alan eşleşiyorsa eşittir.
using System;
public struct DateRange : IEquatable<DateRange>
{
public int Start, End;
public DateRange(int start, int end) { Start = start; End = end; }
public bool Equals(DateRange other) => Start == other.Start && End == other.End;
public override bool Equals(object obj) => obj is DateRange d && Equals(d);
public override int GetHashCode() => HashCode.Combine(Start, End);
}
public class Program
{
public static void Main()
{
Console.WriteLine(new DateRange(1, 5).Equals(new DateRange(1, 5)));
Console.WriteLine(new DateRange(1, 5).Equals(new DateRange(1, 6)));
}
}İşleçlerle Eşleştirme
Kullanıcıların her iki söz dizimiyle de karşılaştırma yapabilmesi için IEquatable<T> arabirimini == ve != ile birleştirin; tümü aynı türü belirtilmiş karşılaştırmayı temel alsın.
using System;
public struct Money : IEquatable<Money>
{
public decimal Amount;
public Money(decimal a) { Amount = a; }
public bool Equals(Money other) => Amount == other.Amount;
public override bool Equals(object obj) => obj is Money m && Equals(m);
public override int GetHashCode() => Amount.GetHashCode();
public static bool operator ==(Money a, Money b) => a.Equals(b);
public static bool operator !=(Money a, Money b) => !a.Equals(b);
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Money(9.99m) == new Money(9.99m));
}
}Kayıtlar Bunu Otomatik Uygular
Bir C# record, sizin için IEquatable<T>, değer tabanlı Equals ve GetHashCode üretir. İhtiyacınız yalnızca değer eşitliğiyse kayıt, gereksiz şablon kodunu ortadan kaldırır.
using System;
public record Point(int X, int Y);
public class Program
{
public static void Main()
{
var a = new Point(1, 2);
var b = new Point(1, 2);
Console.WriteLine(a.Equals(b));
Console.WriteLine(a == b);
}
}Ne Zaman Elle Uygulanmalı
Bir kaydın doğrudan ifade edemeyeceği büyük-küçük harfe duyarsız adlar veya belirli alanları yok sayma gibi özel eşitlik kurallarına ihtiyaç duyduğunuzda IEquatable<T> arabirimini elle uygulayın.
using System;
public class CaseInsensitiveTag : IEquatable<CaseInsensitiveTag>
{
public string Name;
public CaseInsensitiveTag(string name) { Name = name; }
public bool Equals(CaseInsensitiveTag other)
=> other != null && string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase);
public override bool Equals(object obj) => Equals(obj as CaseInsensitiveTag);
public override int GetHashCode() => Name?.ToLowerInvariant().GetHashCode() ?? 0;
}
public class Program
{
public static void Main()
{
Console.WriteLine(new CaseInsensitiveTag("Red").Equals(new CaseInsensitiveTag("RED")));
}
}Kendiniz Deneyin
Küçük bir başvuru türü için IEquatable<T> arabirimini uygulayın ve her eşitlik yolunu türü belirtilmiş yöntem üzerinden yönlendirin.
using System;
using System.Collections.Generic;
public class Coordinate : IEquatable<Coordinate>
{
public int Lat, Lng;
public Coordinate(int lat, int lng) { Lat = lat; Lng = lng; }
public bool Equals(Coordinate other) => other != null && other.Lat == Lat && other.Lng == Lng;
public override bool Equals(object obj) => Equals(obj as Coordinate);
public override int GetHashCode() => HashCode.Combine(Lat, Lng);
}
public class Program
{
public static void Main()
{
var set = new HashSet<Coordinate> { new Coordinate(10, 20) };
Console.WriteLine(set.Contains(new Coordinate(10, 20)));
}
}Hızlı Kontrol
IEquatable
Özet
IEquatable<T>, tür güvenli eşitlik sağlar.
- Yapılarda kutulamayı, sınıflarda tür dönüştürmelerini önleyen
Equals(T other)yöntemini sağlar. - Koleksiyonlar, doğru ve verimli aramalar için bunu tercih eder.
object.Equalsve işleçleri türü belirtilmiş yöntem üzerinden yönlendirin.- Kayıtlar bunu otomatik uygular; özel kurallar için elle uygulayın.
Sıkça Sorulan Sorular
“IEquatable Uygulama” dersi ücretsiz mi?
Evet — “IEquatable Uygulama” 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.
“IEquatable Uygulama” dersinde ne öğreneceğim?
Equals ile tür güvenli eşitlik sağlayı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 1. dersidir.
“IEquatable Uygulama” 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
- IEquatable Uygulama
- GetHashCode'u Geçersiz Kılma
- IComparable Uygulama
- Özel Sıralama için IComparer