Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengelakkan Rekursi Infinite Apabila Membebankan Operator '==' dengan Pemeriksaan Null?

Bagaimana untuk Mengelakkan Rekursi Infinite Apabila Membebankan Operator '==' dengan Pemeriksaan Null?

Barbara Streisand
Barbara Streisandasal
2025-01-08 15:56:41374semak imbas

How to Avoid Infinite Recursion When Overloading the '==' Operator with Null Checks?

Kendalikan semakan nol dengan betul untuk mengelakkan pengulangan tak terhingga dalam beban operator '=='

Apabila membebankan operator '==', pastikan anda mengendalikan semakan nol dengan betul untuk mengelakkan pengulangan tak terhingga. Coretan kod yang disediakan dalam soalan menunjukkan pendekatan yang salah:

<code>if (foo1 == null) return foo2 == null;</code>

Keadaan ini menyebabkan rekursi tak terhingga kerana panggilan kedua ke == sekali lagi akan cuba menyemak sama ada foo1 kosong, menyebabkan gelung tak terhingga.

Kod yang betul

Untuk menyelesaikan masalah ini dan mengelakkan pengulangan tak terhingga, gunakan object.ReferenceEquals untuk semakan nol:

<code>if (object.ReferenceEquals(foo1, null))
    return object.ReferenceEquals(foo2, null);</code>

Keadaan ini mengendalikan kes di mana foo1 atau foo2 (atau kedua-duanya) kosong dengan betul. Mengembalikan benar jika kedua-dua operan kosong;

Pembetulan penuh

Kod yang diperbetulkan di bawah menggabungkan pengubahsuaian ini ke dalam beban operator yang disediakan:

<code>public static bool operator ==(Foo foo1, Foo foo2) {
    if (object.ReferenceEquals(foo1, null))
        return object.ReferenceEquals(foo2, null);
    return foo1.Equals(foo2);
}</code>

Dengan perubahan ini, beban operator yang berlebihan akan dapat mengendalikan semakan nol dengan betul tanpa menyebabkan rekursi tak terhingga.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Rekursi Infinite Apabila Membebankan Operator '==' dengan Pemeriksaan Null?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn