首頁 >後端開發 >C++ >反射能否繞過 C# 中的私有唯讀欄位不變性?

反射能否繞過 C# 中的私有唯讀欄位不變性?

Susan Sarandon
Susan Sarandon原創
2025-01-17 18:04:14873瀏覽

Can Reflection Bypass Private Readonly Field Immutability in C#?

使用反射修改 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn