Akademi C# · Pelajaran

Kesamaan Nilai & Penyahbinaan

Fahami kesamaan struktur record, gantikan Equals/GetHashCode dan gunakan corak penyahbinaan.

Pelajaran 3 daripada 412 langkah

Kesamaan Nilai & Penyahbinaan ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Kupasan Mendalam Kesamaan Rekod

Rekod menjana Equals, GetHashCode dan operator ==/!= secara automatik untuk membandingkan semua properti secara struktur. Memahami cara ini berfungsi membantu Anda menggunakan rekod dengan betul dan mengatasinya apabila perlu.

Cara Kesamaan Dijana secara Automatik Berfungsi

Pengkompil menjana kod yang membandingkan setiap properti menggunakan EqualityComparer<T>.Default. Bagi properti jenis rujukan, perbandingan ini menggunakan Equals milik properti tersebut — bukan kesamaan rujukan.

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 ✓

Mengatasi Kesamaan yang Dijana

Anda boleh mengatasi Equals dan GetHashCode pada rekod apabila Anda mahukan logik kesamaan tersuai — contohnya, dengan membandingkan hanya sebahagian daripada 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();
}

Rekod dalam Koleksi

Oleh sebab rekod melaksanakan IEquatable<T> dengan kesamaan struktur, rekod berfungsi dengan betul sebagai kunci kamus, dalam HashSets, serta dengan Distinct dan GroupBy 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")); // true

Penyahbinaan: Asas

Rekod posisi menjana kaedah Deconstruct secara automatik dengan parameter out bagi setiap properti posisi. Ini membolehkan pembongkaran seperti tupel.

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

Penyahbinaan dalam Pemadanan Corak

Rekod yang dinyahbina dalam ungkapan switch membolehkan pemadanan corak posisi yang berkuasa.

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 3

Kaedah Deconstruct Tersuai

Rekod bukan posisi (dan mana-mana kelas) boleh menambahkan kaedah Deconstruct secara manual. Kaedah pelanjutan juga boleh menambahkan penyahbinaan kepada jenis sedia 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°F

Mengabaikan Bahagian Penyahbinaan

Gunakan nilai abaian (_) untuk mengabaikan bahagian penyahbinaan yang tidak diperlukan — serupa dengan nilai abaian tupel.

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

Corak Properti berbanding Corak Posisi

Rekod menyokong kedua-dua corak posisi (berdasarkan kedudukan) dan corak properti (berdasarkan nama). Corak properti lebih mudah dibaca untuk rekod yang mempunyai 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 Sebenar: Corak Jenis Result

Jenis Result ber gaya kesatuan terbeza yang menggunakan rekod dan penyahbinaan — pendekatan fungsian untuk pengendalian ralat.

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

Semakan Pantas

Apakah kesan penggunaan nilai abaian (_) dalam ungkapan penyahbinaan?

Ringkasan: Kesamaan Nilai & Penyahbinaan

Intipati utama:

  • Kesamaan yang dijana secara automatik membandingkan semua sifat secara struktur dan rekursif
  • Gantikan Equals/GetHashCode pada rekod untuk logik identiti tersuai
  • Rekod berfungsi dengan betul sebagai elemen HashSet dan kunci kamus
  • Rekod berposisi menjana Deconstruct secara automatik — gunakan `var (a, b) = record`
  • Discards (_) mengabaikan nilai berposisi yang tidak diperlukan semasa penguraian
  • Corak Property ({Status: "X"}) lebih mudah dibaca berbanding corak berposisi untuk rekod kompleks
Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Kesamaan Nilai & Penyahbinaan” percuma?

Ya — teks penuh “Kesamaan Nilai & Penyahbinaan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Kesamaan Nilai & Penyahbinaan”?

Fahami kesamaan struktur record, gantikan Equals/GetHashCode dan gunakan corak penyahbinaan. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Kesamaan Nilai & Penyahbinaan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Jenis Record: Asas & Sintaks
  2. Ketidakbolehubahan dengan init & with
  3. Kesamaan Nilai & Penyahbinaan
  4. Record dalam Reka Bentuk Dipacu Domain
← Kembali ke Akademi C#