Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Kesatuan Diskriminasi Jenis-Selamat (Kesatuan Bertanda) dalam C#?

Bagaimana untuk Mencipta Kesatuan Diskriminasi Jenis-Selamat (Kesatuan Bertanda) dalam C#?

Susan Sarandon
Lepaskan: 2025-01-04 16:11:40
asal
633 orang telah melayarinya

How to Create Type-Safe Discriminated Unions (Tagged Unions) in C#?

Diskriminasi Kesatuan dalam C#

Soalan:

Cara mewujudkan kesatuan yang mendiskriminasi dalam C# (juga dipanggil kesatuan teg)? Kesatuan ini membenarkan jenis yang berbeza digunakan untuk mewakili satu nilai dan menyediakan keselamatan jenis masa kompilasi.

Jawapan:

Menggunakan kekangan parameter jenis generik, anda boleh mencipta kesatuan arif jenis selamat. Kod berikut menunjukkan cara membuat kesatuan yang mendiskriminasi dengan tiga kes (int, char dan rentetan):

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

    public sealed class Case1 : Union3<A, B, C>
    {
        public readonly A Item;
        public Case1(A item) : base() { this.Item = item; }
        public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h)
        {
            return f(Item);
        }
    }

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

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

Untuk mencipta tika kesatuan yang mendiskriminasi, gunakan kaedah kilang statik untuk menentukan kes yang sepadan dan memberikan nilai. Contohnya:

Union3<int, char, string> union1 = Union3<int, char, string>.Case1(5);
Union3<int, char, string> union2 = Union3<int, char, string>.Case2('x');
Union3<int, char, string> union3 = Union3<int, char, string>.Case3("Juliet");
Salin selepas log masuk

Dengan menggunakan kaedah Padanan, anda boleh mengakses nilai kesatuan dengan selamat berdasarkan kes tertentu. Contohnya:

string value1 = union1.Match(num => num.ToString(), character => new string(new char[] { character }), word => word);
string value2 = union2.Match(num => num.ToString(), character => new string(new char[] { character }), word => word);
string value3 = union3.Match(num => num.ToString(), character => new string(new char[] { character }), word => word);
Salin selepas log masuk

Kaedah ini menggunakan semakan jenis masa kompilasi untuk memastikan fungsi yang betul disediakan untuk kes yang diberikan. Pengkompil akan membuang ralat jika anda cuba mengakses nilai yang tidak sepadan dengan kes itu.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Kesatuan Diskriminasi Jenis-Selamat (Kesatuan Bertanda) 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