Kayıt benzeri türler ve değere dayalı eşitlik kalıbı
Kayıtlar gibi değere dayalı eşitlik uygulayın: Equals/GetHashCode'u geçersiz kılın, IEquatable 'yi uygulayın, ==/!= operatörlerini ekleyin ve türleri değişmez tutun.
Kayıt benzeri türler ve değere dayalı eşitlik kalıbı, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 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 3 dersten oluşur.
Kayıt benzeri genel bakış
Amaç: C# 6'da nesnelerin değere göre (kayıt benzeri) karşılaştırılmasını sağlayın.
- Değişmez veriler
- Equals ve GetHashCode geçersiz kılma
- IEquatable<T> uygulama
- İsteğe bağlı: ==/!= tanımlama
Başvuru eşitliği sorunu
Sınıflar varsayılan olarak reference değerlerine göre karşılaştırılır. Aynı verilere sahip iki nesne eşit değildir.
using System;
public class PersonRef
{
public string First;
public string Last;
}
public class Program
{
public static void Main(string[] args)
{
PersonRef a = new PersonRef { First = "Ada", Last = "Lovelace" };
PersonRef b = new PersonRef { First = "Ada", Last = "Lovelace" };
Console.WriteLine("Reference Equals? " + object.ReferenceEquals(a, b)); // false
Console.WriteLine("== (default)? " + (a == b)); // false (same as ReferenceEquals for classes)
}
}
Kayıt benzeri sınıf pattern'i
Sınıfı değişmez yapın ve eşitliğin verilere bağlı olması için IEquatable<T>, Equals, GetHashCode ve ==/!= uygulayın.
using System;
// Immutable, value-based equality
public sealed class Person : IEquatable<Person>
{
public string First { get; private set; }
public string Last { get; private set; }
public Person(string first, string last)
{
if (string.IsNullOrEmpty(first)) throw new ArgumentException("first");
if (string.IsNullOrEmpty(last)) throw new ArgumentException("last");
First = first; Last = last;
}
// "With" helper for copy-on-change
public Person WithFirst(string first) { return new Person(first, Last); }
public Person WithLast(string last) { return new Person(First, last); }
public bool Equals(Person other)
{
if (object.ReferenceEquals(other, null)) return false;
if (object.ReferenceEquals(this, other)) return true;
return string.Equals(First, other.First) && string.Equals(Last, other.Last);
}
public override bool Equals(object obj)
{
return Equals(obj as Person);
}
public override int GetHashCode()
{
unchecked
{
int h = 17;
h = h * 31 + (First == null ? 0 : First.GetHashCode());
h = h * 31 + (Last == null ? 0 : Last.GetHashCode());
return h;
}
}
public static bool operator ==(Person a, Person b)
{
if (object.ReferenceEquals(a, b)) return true;
if ((object)a == null || (object)b == null) return false;
return a.Equals(b);
}
public static bool operator !=(Person a, Person b) { return !(a == b); }
}
public class Program
{
public static void Main(string[] args)
{
Person p1 = new Person("Ada", "Lovelace");
Person p2 = new Person("Ada", "Lovelace");
Console.WriteLine("Value Equals? " + (p1 == p2)); // true
Person p3 = p1.WithLast("King");
Console.WriteLine("After With: " + (p1 == p3)); // false
}
}
Yapı eşitliği pattern'i
Yapılar varsayılan olarak ValueType.Equals aracılığıyla fields değerlerine göre karşılaştırılır; ancak IEquatable<T> uygulamak amacı ve karma işlemini açıkça belirtir.
using System;
public struct Point2 : IEquatable<Point2>
{
public int X;
public int Y;
public Point2(int x, int y) { X = x; Y = y; }
public bool Equals(Point2 other)
{
return X == other.X && Y == other.Y;
}
public override bool Equals(object obj)
{
if (!(obj is Point2)) return false;
return Equals((Point2)obj);
}
public override int GetHashCode()
{
unchecked { return (X * 397) ^ Y; }
}
public static bool operator ==(Point2 a, Point2 b) { return a.Equals(b); }
public static bool operator !=(Point2 a, Point2 b) { return !a.Equals(b); }
}
public class Program
{
public static void Main(string[] args)
{
Point2 a = new Point2(1, 2);
Point2 b = new Point2(1, 2);
Console.WriteLine("Struct value equality: " + (a == b)); // true
}
}
Anahtar olarak değer nesneleri
Bir değer nesnesi Dictionary anahtarı olduğunda, doğru Equals/GetHashCode aramaların başarılı olmasını sağlar.
using System;
using System.Collections.Generic;
public sealed class Email : IEquatable<Email>
{
public string Address { get; private set; }
public Email(string address)
{
if (string.IsNullOrEmpty(address)) throw new ArgumentException("address");
Address = address.Trim().ToLowerInvariant();
}
public bool Equals(Email other)
{
if (object.ReferenceEquals(other, null)) return false;
return Address == other.Address;
}
public override bool Equals(object obj) { return Equals(obj as Email); }
public override int GetHashCode()
{
return Address == null ? 0 : Address.GetHashCode();
}
}
public class Program
{
public static void Main(string[] args)
{
Dictionary<Email, string> owners = new Dictionary<Email, string>();
owners[new Email("User@Mail.com")] = "Ada";
Console.WriteLine(owners.ContainsKey(new Email("user@mail.com"))); // true
}
}
Eşitlik denetim listesi
Denetim listesi:
- Verileri değişmez tutun.
- Equals ve GetHashCode geçersiz kılın.
- Tür güvenli ve hızlı karşılaştırmalar için IEquatable<T> uygulayın.
- Kolaylık için ==/!= ekleyin.
- Hem eşitlikte hem de karma işleminde tutarlı fields kullanın.
Kayıt benzeri eşitlik gereksinimi
Özet
Özet: C# 6'da kayıt benzeri türleri elle oluşturursunuz: değişmez veriler, IEquatable<T>, doğru Equals/GetHashCode ve (isteğe bağlı olarak) ==/!=. Bunları kümelerde ve sözlüklerde güvenle kullanın.
Sıkça Sorulan Sorular
“Kayıt benzeri türler ve değere dayalı eşitlik kalıbı” dersi ücretsiz mi?
Evet — “Kayıt benzeri türler ve değere dayalı eşitlik kalıbı” 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 3 dersten oluşur.
“Kayıt benzeri türler ve değere dayalı eşitlik kalıbı” dersinde ne öğreneceğim?
Kayıtlar gibi değere dayalı eşitlik uygulayın: Equals/GetHashCode'u geçersiz kılın, IEquatable 'yi uygulayın, ==/!= operatörlerini ekleyin ve türleri değişmez tutun. 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, 3 dersinin 2. dersidir.
“Kayıt benzeri türler ve değere dayalı eşitlik kalıbı” 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
- Yapılar: değer semantiği ve değişmezlik kalıbı
- Kayıt benzeri türler ve değere dayalı eşitlik kalıbı
- Numaralandırmalar ve [Flags]