Tipe mirip record dan kesetaraan berbasis nilai (pola)
Implementasikan kesetaraan berbasis nilai seperti pada record: timpa Equals/GetHashCode, implementasikan IEquatable , tambahkan operator ==/!=, dan pertahankan tipe agar tidak berubah.
Tipe mirip record dan kesetaraan berbasis nilai (pola) adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 3. 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 3 pelajaran total.
Ikhtisar tipe bergaya nilai
Tujuan: Membuat objek dibandingkan berdasarkan nilai (bergaya record) dalam C# 6.
- Data yang tidak dapat diubah
- Ganti Equals dan GetHashCode
- Implementasikan IEquatable<T>
- Opsional: tentukan ==/!=
Masalah kesetaraan reference
Kelas secara bawaan dibandingkan berdasarkan reference. Dua objek dengan data yang sama tidak dianggap setara.
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)
}
}
Pola kelas bergaya nilai
Jadikan kelas tidak dapat diubah dan implementasikan IEquatable<T>, Equals, GetHashCode, serta ==/!= agar kesetaraan bergantung pada data.
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
}
}
Pola kesetaraan struktur
Struktur secara bawaan dibandingkan berdasarkan bidang melalui ValueType.Equals, tetapi mengimplementasikan IEquatable<T> memperjelas maksud dan pembuatan hash.
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
}
}
Objek nilai sebagai kunci
Saat objek nilai menjadi kunci Dictionary, Equals/GetHashCode yang benar memastikan pencarian berhasil.
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
}
}
Daftar periksa kesetaraan
Daftar periksa:
- Jaga agar data tidak dapat diubah.
- Ganti Equals dan GetHashCode.
- Implementasikan IEquatable<T> untuk perbandingan yang aman bagi tipe dan cepat.
- Tambahkan ==/!= untuk kemudahan.
- Gunakan bidang yang konsisten dalam kesetaraan dan pembuatan hash.
Persyaratan kesetaraan bergaya nilai
Ringkasan
Ringkasan: Dalam C# 6, Anda membuat tipe bergaya record secara manual: data yang tidak dapat diubah, IEquatable<T>, Equals/GetHashCode yang benar, dan (opsional) ==/!=. Gunakan tipe tersebut dengan aman dalam himpunan dan kamus.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Tipe mirip record dan kesetaraan berbasis nilai (pola)” gratis?
Ya — teks lengkap “Tipe mirip record dan kesetaraan berbasis nilai (pola)” 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 3 pelajaran total.
Apa yang akan aku pelajari di “Tipe mirip record dan kesetaraan berbasis nilai (pola)”?
Implementasikan kesetaraan berbasis nilai seperti pada record: timpa Equals/GetHashCode, implementasikan IEquatable , tambahkan operator ==/!=, dan pertahankan tipe agar tidak berubah. 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 2 dari 3.
Berapa lama pelajaran “Tipe mirip record dan kesetaraan berbasis nilai (pola)” 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
- Struct: semantik nilai dan pola ketidakberubahan
- Tipe mirip record dan kesetaraan berbasis nilai (pola)
- Enum dan [Flags]