Rumah >pembangunan bahagian belakang >C++ >Bolehkah Reflection Bypass Sekatan Medan Baca Sahaja Peribadi C#?

Bolehkah Reflection Bypass Sekatan Medan Baca Sahaja Peribadi C#?

Susan Sarandon
Susan Sarandonasal
2025-01-17 18:06:09161semak imbas

Can Reflection Bypass C#'s Private Readonly Field Restrictions?

Gunakan refleksi C# untuk mengubah suai medan baca sahaja peribadi

Pengubah suai

private readonly dalam C# direka untuk menghalang medan daripada diubah suai selepas pembina, tetapi kita boleh meneroka kemungkinan pengubahsuaian melalui refleksi.

Masalah: Menggunakan refleksi untuk mengubah suai medan baca sahaja peribadi

Bolehkah medan baca sahaja peribadi ditukar menggunakan refleksi selepas pembina telah dilaksanakan?

Analisis terperinci

Pertimbangkan kod C# berikut:

<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()); // 输出 123
// 在此处添加反射代码。
Console.WriteLine(foo.GetBar()); // 输出 456</code>

Penyelesaian menggunakan pantulan

Refleksi menyediakan cara untuk mencapai matlamat ini. Begini caranya:

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

Kod ini menggunakan pantulan untuk mengubah suai "bar" medan baca sahaja peribadi Foocontoh kelasfoo. Walaupun readonly menghalang pengubahsuaian langsung, pantulan memintas had ini. Perlu diingat bahawa pendekatan ini secara amnya tidak disyorkan kerana ia memecahkan enkapsulasi dan mungkin membuat kod sukar untuk dikekalkan dan nyahpepijat.

Atas ialah kandungan terperinci Bolehkah Reflection Bypass Sekatan 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