Kaedah C# resolusi lebihan beban dan pengendalian nilai nol
Dalam pengaturcaraan berorientasikan objek, kelebihan beban kaedah membenarkan penggunaan berbilang kaedah dengan nama yang sama tetapi parameter berbeza. Apabila panggilan kaedah dibuat, resolusi beban lampau menentukan kaedah yang hendak dipanggil. Sistem ini menjadi sangat penting apabila berurusan dengan nilai nol.
Pertimbangkan kelas berikut:
<code class="language-csharp">public class EffectOptions { public EffectOptions(params object[] options) { } public EffectOptions(IEnumerable<object> options) { } public EffectOptions(string name) { } public EffectOptions(object owner) { } public EffectOptions(int count) { } public EffectOptions(Point point) { } }</code>
Apabila mencipta tika baharu EffectOptions
dengan nilai nol, contohnya:
<code class="language-csharp">EffectOptions options = new EffectOptions(null);</code>
Proses peleraian beban terlebih dahulu mengenal pasti semua pembina yang boleh diakses:
<code class="language-csharp">public EffectOptions(params object[] options) public EffectOptions(IEnumerable<object> options) public EffectOptions(string name) public EffectOptions(object owner) public EffectOptions(int count) public EffectOptions(Point point)</code>
Seterusnya, buang pembina yang tidak berkenaan berdasarkan jenis parameter. Dengan mengandaikan Point
ialah jenis nilai, versi "int" dan "Point" akan dihapuskan. Baki:
<code class="language-csharp">public EffectOptions(params object[] options) public EffectOptions(IEnumerable<object> options) public EffectOptions(string name) public EffectOptions(object owner)</code>
Sistem resolusi beban lampau kemudian mempertimbangkan pembina "params". Oleh kerana ia boleh dikembangkan atau tidak, bentuk yang dikembangkan dibuang. Ini menghasilkan pembina calon berikut:
<code class="language-csharp">public EffectOptions(object[] options) public EffectOptions(IEnumerable<object> options) public EffectOptions(string name) public EffectOptions(object owner)</code>
Akhir sekali, kenal pasti calon yang terbaik. Ini melibatkan membandingkan kekhususan parameter formal. "objek" kurang spesifik daripada semua jenis lain, jadi versi "objek" dihapuskan. IEnumerable<object>
juga kurang spesifik daripada object[]
dan oleh itu dihapuskan. Dua calon kekal:
<code class="language-csharp">public EffectOptions(object[] options) public EffectOptions(string name)</code>
Walau bagaimanapun, memandangkan object[]
tidak lebih atau kurang spesifik daripada string
, ini mengakibatkan ralat kekaburan. Sistem resolusi beban lampau akhirnya tidak dapat menentukan pembina yang hendak dipanggil.
Atas ialah kandungan terperinci Bagaimanakah Resolusi Lebihan Kaedah C# Mengendalikan Nilai Null Apabila Berbilang Pembina Wujud?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!