Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kesatuan Terdiskriminasi dalam C# Boleh Meningkatkan Toleransi Kesalahan dan Keselamatan Jenis Apabila Mengendalikan Pelbagai Jenis Data?
Kesatuan Terdiskriminasi dalam C#: Pendekatan Toleransi Kesalahan
Dalam pengaturcaraan berorientasikan objek, kesatuan yang didiskriminasi mewakili bekas yang boleh memuatkan satu daripada satu set jenis yang diketahui. Dalam C#, ini boleh dicapai melalui teknik yang dipanggil "Kekangan Jenis Generik."
Pertimbangkan masalah mewakili berbilang jenis data dalam satu struktur data. Sebagai contoh, kami mungkin ingin mencipta kelas "ValueWrapper" yang mempunyai dua medan: "ValueA" dan "ValueB," yang setiap satunya boleh menyimpan nilai rentetan jenis, int atau Foo.
Dalam C# , menggunakan pendekatan berasaskan objek tradisional akan menghasilkan kelas yang kelihatan seperti ini:
public class ValueWrapper { public DateTime ValueCreationDate; // ... other meta data about the value public object ValueA; public object ValueB; }
Walau bagaimanapun, pendekatan ini mempunyai kelemahan. Berurusan dengan nilai sebagai objek boleh memperkenalkan isu keselamatan jenis. Untuk mengatasi cabaran ini, kami boleh memanfaatkan kesatuan yang didiskriminasi.
Dalam C#, kesatuan yang didiskriminasi boleh dilaksanakan menggunakan kekangan jenis generik. Dengan mengekang parameter jenis generik kepada set jenis yang ditentukan, kami boleh memastikan keselamatan jenis pada masa penyusunan.
Salah satu cara untuk mencapai ini ialah dengan mencipta kelas yang merangkum maklumat jenis dan menyediakan kaedah untuk mengakses nilai . Contohnya:
public class Union<A, B, C> { private readonly Type type; public readonly A a; public readonly B b; public readonly C c; public Union(A a) { type = typeof(A); this.a = a; } // ... similar constructors for B and C ... public bool Is<T>() where T : A or T : B or T : C { return typeof(T) == type; } }
Dengan menggunakan kesatuan yang didiskriminasi ini, kita boleh menulis semula kelas "ValueWrapper" seperti berikut:
public class ValueWrapper { public DateTime ValueCreationDate; public Union<int, string, Foo> ValueA; public Union<double, Bar, Foo> ValueB; }
Pendekatan ini memastikan keselamatan jenis dengan mengehadkan nilai yang boleh disimpan dalam "ValueA" dan "ValueB" kepada jenis yang ditentukan. Selain itu, ia menghapuskan keperluan untuk menghantar dan membuka kotak, menyediakan cara yang lebih cekap dan boleh dipercayai untuk bekerja dengan jenis data yang berbeza.
Atas ialah kandungan terperinci Bagaimanakah Kesatuan Terdiskriminasi dalam C# Boleh Meningkatkan Toleransi Kesalahan dan Keselamatan Jenis Apabila Mengendalikan Pelbagai Jenis Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!