Heim >Backend-Entwicklung >C++ >Kann Reflection die privaten schreibgeschützten Felder von C# ändern?

Kann Reflection die privaten schreibgeschützten Felder von C# ändern?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-17 18:16:09702Durchsuche

Can Reflection Modify C#'s Private Readonly Fields?

Verwenden von Reflection zum Ändern privater schreibgeschützter Felder in C#

Reflection in C# bietet leistungsstarke Funktionen, einschließlich der Möglichkeit, sogar private schreibgeschützte Felder zu bearbeiten. Lassen Sie uns untersuchen, ob wir ein privates schreibgeschütztes Feld ändern können, nachdem ein Objekt erstellt wurde.

Betrachten Sie dieses Beispiel:

<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>

Das Feld durch Reflexion verändern

Jetzt verwenden wir Reflektion, um das Feld bar zu ändern:

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

Dieses Code-Snippet greift mithilfe von Reflektion auf das private bar-Feld zu und setzt seinen Wert auf 567.

Das Ergebnis

Nach dieser Reflexionsoperation hat sich der Wert von bar tatsächlich geändert:

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

Dies zeigt, dass die Reflektion trotz der Deklaration private readonly eine Änderung des Feldwerts nach der Objekterstellung ermöglicht. Obwohl dies möglich ist, gilt es im Allgemeinen als schlechte Praxis und sollte aufgrund möglicher unvorhergesehener Folgen und Wartbarkeitsproblemen vermieden werden, sofern dies nicht unbedingt erforderlich ist.

Das obige ist der detaillierte Inhalt vonKann Reflection die privaten schreibgeschützten Felder von C# ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn