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