Kesatuan Terdiskriminasi dalam C#: Menguatkuasakan Keselamatan Jenis
Coretan kod yang disediakan mempamerkan percubaan untuk mencipta kesatuan terdiskriminasi dalam C#, sama dengan konsep kesatuan dalam C. Walaupun pendekatan ini memberikan beberapa kemiripan jenis keselamatan, ia tidak mempunyai pemeriksaan jenis yang dikuatkuasakan pengkompil dalam fungsi Is() dan As().
Peningkatan untuk Keselamatan Jenis
Untuk menangani isu ini, penyelesaian yang dipertingkatkan menggunakan struktur kesatuan jenis selamat yang lebih ketat . Kesatuan ini menggunakan mekanisme pemadanan corak C# untuk membuang ralat kompilasi apabila penggunaan jenis data yang salah:
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<A, B, C> : 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<A, B, C> : Union3<A, B, C> { public readonly B Item; public Case2(B item) : base() { 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<A, B, C> : Union3<A, B, C> { public readonly C Item; public Case3(C item) : base() { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return h(Item); } }
Penggunaan
Menggunakan kesatuan yang dipertingkat ini, keselamatan jenis dikuatkuasakan melalui pemadanan corak . Sebagai contoh, cubaan menggunakan jenis data yang salah dalam kod berikut akan mengakibatkan ralat penyusunan:
public void DoSomething() { if (ValueA.Match(a => true, b => false, c => false)) { var s = ValueA.Match(a => a.ToString(), b => null, c => null); // Safely use string type 's' } }
Dengan melaksanakan kesatuan yang didiskriminasi dengan padanan corak, kami mencapai tahap keselamatan jenis yang lebih tinggi dan menghapuskan potensi masa jalan ralat yang dikaitkan dengan pengendalian jenis data yang salah.
Atas ialah kandungan terperinci Bagaimanakah Pemadanan Corak Boleh Meningkatkan Keselamatan Jenis dalam Kesatuan Terdiskriminasi C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!