Kesetaraan Nilai & Dekonstruksi
Pahami kesetaraan struktural record, timpa Equals/GetHashCode, dan gunakan pola dekonstruksi.
Kesetaraan Nilai & Dekonstruksi adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.
Pendalaman Kesetaraan Record
Record secara otomatis menghasilkan Equals, GetHashCode, dan operator ==/!= yang membandingkan semua properti secara struktural. Memahami cara kerjanya membantu Anda menggunakan record dengan benar dan melakukan override jika diperlukan.
Cara Kerja Kesetaraan yang Dibuat Otomatis
Kompilator menghasilkan kode yang membandingkan setiap properti menggunakan EqualityComparer<T>.Default. Untuk properti bertipe referensi, yang digunakan adalah Equals milik properti tersebut—bukan kesetaraan referensi.
public record Address(string Street, string City);
public record Person(string Name, Address HomeAddress);
var a = new Person("Alice", new Address("123 Main", "NYC"));
var b = new Person("Alice", new Address("123 Main", "NYC"));
Console.WriteLine(a == b); // True — deep structural equality
// Equality checks:
// Name: "Alice" == "Alice" ✓
// HomeAddress: compares Address properties recursively ✓Menimpa Kesetaraan yang Dibuat Otomatis
Anda dapat melakukan override terhadap Equals dan GetHashCode pada record ketika menginginkan logika kesetaraan khusus, misalnya dengan hanya membandingkan sebagian properti.
public record Customer(int Id, string Name, string Email)
{
// Consider customers equal if they have the same ID,
// regardless of name or email changes
public virtual bool Equals(Customer? other)
=> other is not null && Id == other.Id;
public override int GetHashCode() => Id.GetHashCode();
}Record dalam Koleksi
Karena record mengimplementasikan IEquatable<T> dengan kesetaraan struktural, record dapat digunakan dengan benar sebagai kunci kamus, dalam HashSets, serta dengan Distinct dan GroupBy milik LINQ.
public record Tag(string Name, string Color);
var tags = new List<Tag>
{
new("C#", "blue"), new("C#", "blue"), new("dotnet", "purple")
};
var unique = tags.Distinct().ToList(); // [Tag(C#, blue), Tag(dotnet, purple)]
var set = new HashSet<Tag>(tags);
set.Contains(new Tag("C#", "blue")); // trueDekonstruksi: Dasar-Dasarnya
Record posisional secara otomatis menghasilkan metode Deconstruct dengan parameter out untuk setiap properti posisional. Ini memungkinkan pembongkaran yang menyerupai tuple.
public record Point(double X, double Y);
public record RGB(byte R, byte G, byte B);
var p = new Point(3.0, 4.0);
var (x, y) = p; // deconstruct
Console.WriteLine($"{x}, {y}");
var color = new RGB(255, 128, 0);
var (r, g, b) = color;
Console.WriteLine($"R={r}, G={g}, B={b}");Dekonstruksi dalam Pencocokan Pola
Record yang didekonstruksi dalam ekspresi switch memungkinkan pencocokan pola posisional yang kuat.
public record Point(int X, int Y);
string Classify(Point p) => p switch
{
(0, 0) => "Origin",
(int x, 0) => $"X-axis at {x}",
(0, int y) => $"Y-axis at {y}",
(int x, int y) when x == y => $"Diagonal at {x}",
(int x, int y) => $"Point ({x}, {y})"
};
Console.WriteLine(Classify(new Point(0, 0))); // Origin
Console.WriteLine(Classify(new Point(3, 3))); // Diagonal at 3Metode Deconstruct Khusus
Record nonposisional (dan kelas apa pun) dapat menambahkan metode Deconstruct secara manual. Metode ekstensi juga dapat menambahkan dekonstruksi ke tipe yang sudah ada.
public class Temperature
{
public double Celsius { get; }
public Temperature(double c) => Celsius = c;
// Manual Deconstruct
public void Deconstruct(out double celsius, out double fahrenheit)
{
celsius = Celsius;
fahrenheit = Celsius * 9 / 5 + 32;
}
}
var t = new Temperature(100);
var (c, f) = t;
Console.WriteLine($"{c}°C = {f}°F"); // 100°C = 212°FMengabaikan Bagian Dekonstruksi
Gunakan discard (_) untuk mengabaikan bagian dekonstruksi yang tidak diperlukan, serupa dengan discard pada tuple.
public record Order(int Id, string Customer, decimal Total, DateTime Date);
var order = new Order(42, "Alice", 99.99m, DateTime.UtcNow);
// Only want Id and Total
var (id, _, total, _) = order;
Console.WriteLine($"Order {id}: ${total}");
// In switch: ignore some fields
string Classify(Order o) => o switch
{
(_, _, > 1000, _) => "High value",
(_, _, > 100, _) => "Medium value",
_ => "Low value"
};Pola Properti vs Pola Posisional
Record mendukung pola posisional (berdasarkan posisi) dan pola properti (berdasarkan nama). Pola properti lebih mudah dibaca untuk record dengan banyak properti.
public record Order(int Id, string Status, decimal Total);
// Positional pattern:
string DescribePos(Order o) => o switch
{
(_, "Shipped", > 100) => "High-value shipped",
_ => "Other"
};
// Property pattern (more readable):
string DescribeProp(Order o) => o switch
{
{ Status: "Shipped", Total: > 100 } => "High-value shipped",
{ Status: "Cancelled" } => "Cancelled",
_ => "Other"
};Dunia Nyata: Pola Tipe Result
Tipe Result bergaya union terdiskriminasi yang menggunakan record dan dekonstruksi—pendekatan fungsional untuk penanganan kesalahan.
public abstract record Result<T>;
public record Success<T>(T Value) : Result<T>;
public record Failure<T>(string Error) : Result<T>;
Result<Order> PlaceOrder(CreateOrderRequest req)
{
if (req.Quantity <= 0)
return new Failure<Order>("Quantity must be positive");
var order = CreateOrder(req);
return new Success<Order>(order);
}
// Consuming:
var result = PlaceOrder(request);
switch (result)
{
case Success<Order>(var order):
return Results.Created($"/orders/{order.Id}", order);
case Failure<Order>(var error):
return Results.BadRequest(error);
}Pemeriksaan Singkat
Apa yang dilakukan penggunaan discard (_) dalam ekspresi dekonstruksi?
Ringkasan: Kesetaraan Nilai & Dekonstruksi
Inti penting:
- Kesetaraan yang dibuat otomatis membandingkan semua properti secara struktural dan rekursif
- Ambil alih Equals/GetHashCode pada record untuk logika identitas khusus
- Record berfungsi dengan benar sebagai elemen HashSet dan kunci kamus
- Record berbasis posisi otomatis menghasilkan Deconstruct — gunakan var (a, b) = record
- Nilai buang (_) mengabaikan nilai posisi yang tidak diperlukan saat pemisahan
- Pola properti ({Status: "X"}) lebih mudah dibaca daripada pola berbasis posisi untuk record yang kompleks
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kesetaraan Nilai & Dekonstruksi” gratis?
Ya — teks lengkap “Kesetaraan Nilai & Dekonstruksi” 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 “Kesetaraan Nilai & Dekonstruksi”?
Pahami kesetaraan struktural record, timpa Equals/GetHashCode, dan gunakan pola dekonstruksi. 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 3 dari 4.
Berapa lama pelajaran “Kesetaraan Nilai & Dekonstruksi” 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
- Tipe Record: Dasar & Sintaks
- Immutability dengan init & with
- Kesetaraan Nilai & Dekonstruksi
- Record dalam Domain-Driven Design