0Pricing
C# Academy · Pelajaran

Mengimplementasikan IEquatable

Sediakan kesetaraan yang aman berdasarkan tipe dengan Equals.

Mengimplementasikan IEquatable adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Mengapa IEquatable<T>?

IEquatable<T> menyediakan metode Equals(T other) yang bertipe kuat. Metode ini menghindari pembungkusan untuk tipe nilai dan menghindari konversi tipe untuk tipe referensi, sehingga pemeriksaan kesamaan menjadi lebih cepat dan jelas.

Menerapkan Antarmuka

Terapkan IEquatable<T> dan sediakan Equals(T other). Anda juga harus menimpa object.Equals dan GetHashCode yang diwarisi agar semua jalur tetap konsisten.

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)));
    }
}

Menghindari Pembungkusan untuk Struct

object.Equals(object) yang tidak generik membungkus argumen struct. Equals(Point other) bertipe dari IEquatable<T> menerima struct secara langsung, sehingga tidak ada alokasi yang terjadi.

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
    }
}

Koleksi Menggunakan IEquatable<T>

List<T>.Contains, Dictionary, dan HashSet mengutamakan IEquatable<T>.Equals jika tersedia. Menerapkannya membuat operasi ini efisien dan benar untuk tipe Anda.

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)));
    }
}

Tipe Referensi dan IEquatable<T>

Kelas juga dapat menerapkan IEquatable<T>. Equals bertipe menghindari konversi tipe, dan Anda menangani null secara eksplisit untuk parameter referensi.

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));
    }
}

Arahkan object.Equals melalui Versi Bertipe

Pola yang rapi adalah menulis perbandingan sekali dalam Equals(T) dan membuat object.Equals mendelegasikan tugas kepadanya. Dengan demikian, keduanya pasti berperilaku sama.

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)));
    }
}

Membandingkan Beberapa Bidang

Untuk tipe yang memiliki beberapa bidang, bandingkan semuanya dalam Equals. Dua instans dianggap sama hanya jika setiap bidang yang relevan cocok.

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)));
    }
}

Pasangkan dengan Operator

Gabungkan IEquatable<T> dengan == dan != agar pengguna dapat membandingkan dengan kedua sintaksis tersebut, yang semuanya didukung oleh perbandingan bertipe yang sama.

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));
    }
}

Record Mengimplementasikannya Otomatis

record C# membuat IEquatable<T>, Equals berbasis nilai, dan GetHashCode untuk Anda. Jika yang Anda perlukan hanyalah kesamaan berdasarkan nilai, record menghemat kode berulang.

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);
    }
}

Kapan Menerapkannya Secara Manual

Terapkan IEquatable<T> secara manual ketika Anda memerlukan aturan kesamaan khusus, seperti nama yang tidak membedakan huruf besar-kecil atau pengabaian bidang tertentu, yang tidak dapat dinyatakan langsung oleh record.

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")));
    }
}

Coba Sendiri

Terapkan IEquatable<T> untuk tipe referensi kecil dan arahkan setiap jalur pemeriksaan kesamaan melalui metode bertipe tersebut.

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)));
    }
}

Pemeriksaan Singkat

Ingat kembali manfaat IEquatable.

Rangkuman

IEquatable<T> memberikan pemeriksaan kesamaan yang aman berdasarkan tipe.

  • Menyediakan Equals(T other), sehingga menghindari pembungkusan untuk struct dan konversi tipe untuk kelas.
  • Koleksi mengutamakannya untuk pencarian yang benar dan efisien.
  • Arahkan object.Equals dan operator melalui metode bertipe.
  • Record menerapkannya secara otomatis; terapkan secara manual untuk aturan khusus.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengimplementasikan IEquatable” gratis?

Ya — teks lengkap “Mengimplementasikan IEquatable” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengimplementasikan IEquatable”?

Sediakan kesetaraan yang aman berdasarkan tipe dengan Equals. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Mengimplementasikan IEquatable” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengimplementasikan IEquatable
  2. Mengganti GetHashCode
  3. Mengimplementasikan IComparable
  4. IComparer untuk Pengurutan Kustom
← Kembali ke C# Academy