Rumah >pembangunan bahagian belakang >C++ >Bolehkah Reflection Mengubah Suai Medan Baca Sahaja Peribadi C#?

Bolehkah Reflection Mengubah Suai Medan Baca Sahaja Peribadi C#?

Patricia Arquette
Patricia Arquetteasal
2025-01-17 18:16:09627semak imbas

Can Reflection Modify C#'s Private Readonly Fields?

Menggunakan Refleksi untuk Mengubah Suai Medan Bacaan Persendirian dalam C#

Refleksi dalam C# menawarkan keupayaan berkuasa, termasuk keupayaan untuk memanipulasi walaupun medan baca sahaja peribadi. Mari kita periksa sama ada kita boleh mengubah medan baca sahaja peribadi selepas objek dibuat.

Pertimbangkan contoh ini:

<code class="language-csharp">public class Foo
{
    private readonly int bar;

    public Foo(int num)
    {
        bar = num;
    }

    public int GetBar()
    {
        return bar;
    }
}

Foo foo = new Foo(123);
Console.WriteLine(foo.GetBar()); // Outputs 123</code>

Mengubah suai Medan dengan Refleksi

Sekarang, mari kita gunakan refleksi untuk menukar medan bar:

<code class="language-csharp">typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(foo, 567);</code>

Coretan kod ini menggunakan pantulan untuk mengakses medan bar peribadi dan menetapkan nilainya kepada 567.

Hasilnya

Selepas operasi pantulan ini, nilai bar sememangnya telah berubah:

<code class="language-csharp">Console.WriteLine(foo.GetBar()); // Outputs 567</code>

Ini menunjukkan bahawa walaupun diisytiharkan private readonly, pantulan membenarkan pengubahsuaian nilai medan selepas penciptaan objek. Walaupun ini mungkin, ia secara amnya dianggap sebagai amalan buruk dan harus dielakkan melainkan benar-benar perlu disebabkan oleh kemungkinan akibat yang tidak diduga dan isu kebolehselenggaraan.

Atas ialah kandungan terperinci Bolehkah Reflection Mengubah Suai Medan Baca Sahaja Peribadi C#?. 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