Kaedah yang berkesan dalam C# untuk menentukan dengan tepat sama ada sesuatu jenis ialah subjenis jenis lain
Apabila berurusan dengan jenis dalam C#, anda selalunya perlu menentukan hubungan antara jenis. Keperluan biasa adalah untuk menyemak sama ada sesuatu jenis ialah subkelas jenis lain, atau lebih tepat lagi, subjenis kelas itu.
IsSubclassOf: Kebenaran separa
KaedahType.IsSubclassOf
menyediakan cara untuk menyemak terus sama ada sesuatu jenis ialah subkelas jenis lain:
<code class="language-csharp">typeof(SubClass).IsSubclassOf(typeof(BaseClass)); // 返回 true</code>
Walau bagaimanapun, pendekatan ini gagal apabila kedua-dua jenis adalah sama:
<code class="language-csharp">typeof(BaseClass).IsSubclassOf(typeof(BaseClass)); // 返回 false</code>
AssignableFrom: Lebih luas tetapi tidak sempurna
PendekatanType.IsAssignableFrom
menyelesaikan masalah ini, tetapi ia juga mempunyai kelemahannya sendiri. Walaupun ia menunjukkan dengan tepat bahawa subkelas atau jenis yang sama ialah subjenis, ia juga mungkin mengembalikan positif palsu untuk jenis yang tidak berkaitan:
<code class="language-csharp">typeof(BaseClass).IsAssignableFrom(typeof(DerivedClass)); // 返回 true typeof(BaseClass).IsAssignableFrom(typeof(BaseClass)); // 返回 true typeof(int[]).IsAssignableFrom(typeof(uint[])); // 返回 true</code>
adalah dan sebagai: berorientasikan objek tetapi dengan pengehadan
Kata kunciis
dan as
juga boleh digunakan untuk semakan jenis, tetapi kata kunci tersebut bertindak pada tika objek dan bukannya menaip sendiri. Ini mengehadkan kebolehgunaannya dalam analisis kod statik.
Kesimpulan: Menggabungkan kaedah untuk meningkatkan ketepatan
Malangnya, tiada satu kaedah terbina dalam menangkap sepenuhnya konsep semakan subjenis tanpa memperkenalkan hasil positif palsu atau memerlukan rujukan objek. Cara yang paling boleh dipercayai ialah menggabungkan kaedah Type.IsSubclassOf
dengan semakan kesaksamaan yang jelas:
<code class="language-csharp">bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) { return potentialDescendant.IsSubclassOf(potentialBase) || potentialDescendant == potentialBase; }</code>
Kaedah tersuai ini menyediakan cara yang ringkas dan tepat untuk menentukan sama ada sesuatu jenis ialah subjenis jenis lain, termasuk kes jenis yang sama.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Dengan Tepat jika Satu Jenis Adalah Subjenis Lain dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!