Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengelakkan Rekursi Infinite Apabila Membebankan Operator '==' dalam C# dengan Pemeriksaan Null?
Apabila melebihkan operator ==
dalam C#, elakkan rekursi tak terhingga apabila berurusan dengan nilai nol
Terdapat masalah biasa apabila mengendalikan nilai nol apabila melebihkan operator ==
dalam C#. Pertimbangkan coretan kod berikut:
<code class="language-csharp">Foo foo1 = null; Foo foo2 = new Foo(); Assert.IsFalse(foo1 == foo2); public static bool operator ==(Foo foo1, Foo foo2) { if (foo1 == null) return foo2 == null; // 潜在的无限递归 return foo1.Equals(foo2); }</code>
Dalam kes ini, bebanan ==
menggunakan operator ==
itu sendiri untuk menyemak nilai nol. Ini boleh membawa kepada rekursi tak terhingga kerana jika foo1
kosong, foo2 == null
juga akan dinilai kosong, menyebabkan kaedah ==
dipanggil tak terhingga.
Untuk mengelakkan masalah ini, bebanan ==
harus menggunakan ReferenceEquals
dan bukannya ==
untuk menyemak nilai nol. ReferenceEquals
tidak melakukan panggilan rekursif, jadi ia boleh menentukan dengan selamat sama ada satu atau dua objek adalah batal tanpa menyebabkan rekursi tak terhingga. Kod yang diperbetulkan adalah seperti berikut:
<code class="language-csharp">Foo foo1 = null; Foo foo2 = new Foo(); Assert.IsFalse(foo1 == foo2); public static bool operator ==(Foo foo1, Foo foo2) { if (object.ReferenceEquals(foo1, null)) return object.ReferenceEquals(foo2, null); return foo1.Equals(foo2); }</code>
Dengan mengubah suai semakan nol untuk menggunakan ReferenceEquals
, beban lampau ==
mengendalikan nilai nol dengan cekap tanpa mencetuskan rekursi tak terhingga. Ia membandingkan nilai nol Equals
dan foo1
dengan betul sebelum beralih ke perbandingan foo2
. Pendekatan ini memastikan bahawa tingkah laku pengendali sentiasa konsisten dan boleh dipercayai, walaupun dengan kehadiran nilai nol.
Penjelasan yang disemak ini menjelaskan masalah dan penyelesaian dengan lebih ringkas. Imej kekal dalam format dan lokasi asalnya.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Rekursi Infinite Apabila Membebankan Operator '==' dalam C# dengan Pemeriksaan Null?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!