Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Kami Boleh Mencapai Kesatuan Diskriminasi Jenis-Selamat dalam C#?

Bagaimanakah Kami Boleh Mencapai Kesatuan Diskriminasi Jenis-Selamat dalam C#?

Mary-Kate Olsen
Lepaskan: 2025-01-02 14:20:43
asal
380 orang telah melayarinya

How Can We Achieve Type-Safe Discriminated Unions in C#?

Kesatuan Terdiskriminasi dalam C

Pengenalan:

Kesatuan terdiskriminasi, juga dikenali sebagai kesatuan teg atau kesatuan terputus, adalah konstruk pengaturcaraan yang membolehkan penyimpanan pelbagai jenis data dalam satu pembolehubah. Mereka menyediakan cara selamat jenis untuk mewakili satu set nilai dengan bilangan varian yang terhad.

Memahami Masalah:

Soalan mencadangkan kelas Union dalam C# untuk menyediakan fungsi yang serupa dengan kesatuan gaya C. Walau bagaimanapun, kelas tidak mempunyai pemeriksaan jenis dikuatkuasakan pengkompil apabila menggunakan fungsi Is dan As. Isu timbul apabila cuba mendapatkan semula nilai jenis tertentu tanpa memastikan bahawa kesatuan itu benar-benar mengandungi jenis itu.

Bolehkah Kita Mencapai Type-Safe Union dalam C#?

Ya, kami boleh melaksanakan kesatuan diskriminasi jenis selamat dalam C# menggunakan kekangan generik dan padanan corak. Berikut ialah contoh:

public abstract class Union<A, B, C>
{
    public abstract T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h);
}

public class Case1<A, B, C> : Union<A, B, C>
{
    public readonly A Item;
    public Case1(A item) { Item = item; }
    public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => f(Item);
}

public class Case2<A, B, C> : Union<A, B, C>
{
    public readonly B Item;
    public Case2(B item) { Item = item; }
    public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => g(Item);
}

public class Case3<A, B, C> : Union<A, B, C>
{
    public readonly C Item;
    public Case3(C item) { Item = item; }
    public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => h(Item);
}
Salin selepas log masuk

Penggunaan:

Untuk menggunakan jenis Kesatuan ini, buat contoh kes tertentu:

var union1 = new Case1<int, string, bool>(5);
var union2 = new Case2<int, string, bool>('a');
var union3 = new Case3<int, string, bool>(true);
Salin selepas log masuk

Padanan Corak:

Untuk mendapatkan semula nilai daripada kesatuan, gunakan corak padanan:

var value1 = union1.Match(n => n, _ => null, _ => null); // Returns 5 (int)
var value2 = union2.Match(_ => null, c => c.ToString(), _ => null); // Returns "a" (string)
var value3 = union3.Match(_ => null, _ => null, b => b.ToString()); // Returns "True" (string)
Salin selepas log masuk

Kesimpulan:

Penyelesaian ini menyediakan kesatuan diskriminasi jenis selamat dalam C# dengan memanfaatkan pemadanan generik dan corak. Ia memastikan bahawa kod tidak cuba mengakses nilai yang salah, meningkatkan keselamatan dan ketepatan aplikasi.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Mencapai Kesatuan Diskriminasi Jenis-Selamat dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan