使用反射修改 C# 中的私有唯讀欄位
雖然 C# 中的 private readonly
欄位旨在防止物件初始化後被修改,但反射提供了一種繞過此限制的機制。 這意味著,儘管有 readonly
關鍵字,這些欄位的值在建構函式完成後仍可以變更。
讓我們用一個例子來說明這一點:
<code class="language-csharp">public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } }</code>
這裡,Foo
包含一個private readonly int bar
。 我們可以用反射來修改 bar
:
<code class="language-csharp">Foo foo = new Foo(123); typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(foo, 567);</code>
此程式碼片段使用反射來存取私有 bar
欄位並將其值設為 567。這顯示 readonly
修飾符與 private
存取結合使用,並不能保證使用反射時的絕對不變性。 了解這種行為對於避免意外問題並保持程式碼完整性至關重要。
以上是反射能否繞過 C# 中的私有唯讀欄位不變性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!