0Pricing
C# Academy · Ders

Eşitlik ve özetleme (değer ve başvuru)

Başvuru eşitliği ile değer eşitliğini anlayın, Equals/GetHashCode yöntemlerini doğru biçimde geçersiz kılın, IEquatable uygulayın ve küme/sözlüklerle özel karşılaştırıcılar kullanın.

Eşitlik ve özetleme (değer ve başvuru), CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 3. 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.

Eşitliğin temelleri

Amaç: Eşitliğin beklediğiniz gibi çalışmasını sağlamak.

  • Referans ve değer eşitliği
  • Equals + GetHashCode sözleşmesi
  • Hız için IEquatable<T>
  • Türü değiştiremediğinizde özel karşılaştırıcılar

Referans eşitliği tuzağı

Sınıflar varsayılan olarak referans eşitliği kullanır. Aynı verilere sahip iki ayrı nesne, değer eşitliğini uygulamadığınız sürece eşit değildir.

using System;
using System.Collections.Generic;

public sealed class Point // no overrides
{
  public int X;
  public int Y;
  public Point(int x, int y){ X = x; Y = y; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Point a = new Point(1, 2);
    Point b = new Point(1, 2);

    Console.WriteLine("a == b ? " + (a == b)); // reference equality: False
    Console.WriteLine("a.Equals(b) ? " + a.Equals(b)); // False

    HashSet<Point> set = new HashSet<Point>();
    set.Add(a);
    Console.WriteLine("Contains b? " + set.Contains(b)); // False (unexpected)
  }
}

Değer eşitliği uygulandı

IEquatable<T> uygulayın, Equals ve GetHashCode yöntemlerini geçersiz kılın. Karma, eşitlikle uyumlu olmalıdır: eşit nesneler → aynı karma.

using System;
using System.Collections.Generic;

public sealed class ValuePoint : IEquatable<ValuePoint>
{
  public int X;
  public int Y;
  public ValuePoint(int x, int y){ X = x; Y = y; }

  public bool Equals(ValuePoint other)
  {
    if (ReferenceEquals(other, null)) return false;
    if (ReferenceEquals(this, other)) return true;
    return X == other.X && Y == other.Y;
  }

  public override bool Equals(object obj)
  {
    return Equals(obj as ValuePoint);
  }

  public override int GetHashCode()
  {
    // Simple, stable combination (avoid randomness)
    unchecked
    {
      int hash = 17;
      hash = hash * 31 + X.GetHashCode();
      hash = hash * 31 + Y.GetHashCode();
      return hash;
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    ValuePoint a = new ValuePoint(1, 2);
    ValuePoint b = new ValuePoint(1, 2);

    Console.WriteLine("a.Equals(b)? " + a.Equals(b)); // True

    HashSet<ValuePoint> set = new HashSet<ValuePoint>();
    set.Add(a);
    Console.WriteLine("Contains b? " + set.Contains(b)); // True (value semantics)
  }
}

Özel karşılaştırıcı

Türün kendisini değiştiremediğinizde HashSet/Dictionary için özel bir IEqualityComparer<T> iletin.

using System;
using System.Collections.Generic;

public sealed class Person // imagine from a library; cannot edit
{
  public string Name;
  public int BirthYear;
  public Person(string name, int year){ Name = name; BirthYear = year; }
}

public sealed class PersonComparer : IEqualityComparer<Person>
{
  public bool Equals(Person a, Person b)
  {
    if (ReferenceEquals(a, b)) return true;
    if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) return false;
    return a.Name == b.Name && a.BirthYear == b.BirthYear;
  }

  public int GetHashCode(Person p)
  {
    if (ReferenceEquals(p, null)) return 0;
    unchecked
    {
      int h = 23;
      h = h * 31 + (p.Name == null ? 0 : p.Name.GetHashCode());
      h = h * 31 + p.BirthYear.GetHashCode();
      return h;
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Person p1 = new Person("Ada", 1815);
    Person p2 = new Person("Ada", 1815);

    HashSet<Person> set = new HashSet<Person>(new PersonComparer());
    set.Add(p1);
    Console.WriteLine("Contains p2? " + set.Contains(p2)); // True via comparer
  }
}

Sözleşme ve tuzaklar

Kurallar:

  • Equals(a,b) true ise ⇒ GetHashCode(a) == GetHashCode(b)
  • Eşitlik yansımalı, simetrik ve geçişli olmalıdır
  • Mümkün olduğunda karma için değişmez alanlar kullanın
  • GetHashCode içinde rastgele değerler kullanmayın

Yapı ve sınıf notu

Yapılar varsayılan olarak alanlarına göre karşılaştırılır (değer anlamı). Sınıflar, değer eşitliğini uygulamadığınız sürece referansa göre karşılaştırılır.

using System;

public struct PointS // struct: value type
{
  public int X;
  public int Y;
  public PointS(int x, int y){ X = x; Y = y; }
}

public class Program
{
  public static void Main(string[] args)
  {
    PointS a = new PointS(1, 2);
    PointS b = new PointS(1, 2);
    Console.WriteLine("Struct equality: " + a.Equals(b)); // True by default (field-wise)
  }
}

Koleksiyonlar için eşitlik sözleşmesi

Hızlı kontrol: HashSet ve Dictionary içinde çalışan bir sınıfa değer eşitliği kazandırmak için ne uygulamalısınız?

Özet

Özet: Değer anlamı için sınıfların Equals/GetHashCode (ve çoğu zaman IEquatable<T>) uygulaması gerekir; türler düzenlenemiyorsa özel karşılaştırıcılar kullanın.

Sıkça Sorulan Sorular

“Eşitlik ve özetleme (değer ve başvuru)” dersi ücretsiz mi?

Evet — “Eşitlik ve özetleme (değer ve başvuru)” 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.

“Eşitlik ve özetleme (değer ve başvuru)” dersinde ne öğreneceğim?

Başvuru eşitliği ile değer eşitliğini anlayın, Equals/GetHashCode yöntemlerini doğru biçimde geçersiz kılın, IEquatable uygulayın ve küme/sözlüklerle özel karşılaştırıcılar kullanı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, 3 dersinin 3. dersidir.

“Eşitlik ve özetleme (değer ve başvuru)” 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

  1. HashSet , SortedSet , Queue , Stack
  2. ConcurrentDictionary ve değişmez koleksiyonlar
  3. Eşitlik ve özetleme (değer ve başvuru)
← C# Academy Sayfasına Dön