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

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

Linda Hamilton
Lepaskan: 2025-01-08 15:52:45
asal
493 orang telah melayarinya

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

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:

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);
}
Salin selepas log masuk

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:

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);
}
Salin selepas log masuk

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!

Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan