Mengubah suai Medan Baca Sahaja dalam C# Menggunakan Refleksi
Walaupun medan private readonly
dalam C# direka untuk mengelakkan pengubahsuaian selepas pemulaan objek, refleksi menyediakan mekanisme untuk memintas sekatan ini. Ini bermakna, walaupun kata kunci readonly
, nilai medan ini boleh ditukar selepas pembina selesai.
Mari kita gambarkan ini dengan contoh:
<code class="language-csharp">public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } }</code>
Di sini, Foo
mengandungi private readonly int bar
. Kita boleh mengubah suai bar
menggunakan refleksi:
<code class="language-csharp">Foo foo = new Foo(123); 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. Ini menunjukkan bahawa pengubah suai readonly
, bersama-sama dengan akses private
, tidak menjamin kebolehubahan mutlak apabila pantulan digunakan . Adalah penting untuk memahami tingkah laku ini untuk mengelakkan isu yang tidak dijangka dan mengekalkan integriti kod.
Atas ialah kandungan terperinci Bolehkah Reflection Bypass Private Readonly Field Immutability dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!