Heim > Backend-Entwicklung > C++ > Warum kann „ref' nicht mit dem Parameter „this' in C#-Erweiterungsmethoden (vor C# 7.2) verwendet werden?

Warum kann „ref' nicht mit dem Parameter „this' in C#-Erweiterungsmethoden (vor C# 7.2) verwendet werden?

Patricia Arquette
Freigeben: 2025-01-07 16:41:43
Original
310 Leute haben es durchsucht

Why Can't

C#-Erweiterungsmethoden und der „ref“-Modifikator: Die Nuance des „this“-Parameters verstehen

C#-Erweiterungsmethoden erweitern vorhandene Typen um neue Funktionen, ohne ihren ursprünglichen Code zu ändern. Bei der Verwendung des ref-Modifikators mit dem this-Parameter ergibt sich jedoch ein wesentlicher Unterschied, insbesondere hinsichtlich der Auswirkungen auf die zu erweiternde Instanz.

refModifikator in Erweiterungsmethodenargumenten

Erweiterungsmethoden können durch ref geänderte Argumente akzeptieren und so Änderungen an den ursprünglichen Werten ermöglichen. Bedenken Sie:

<code class="language-csharp">public static void Modify(ref int x, int y) { x = y; }</code>
Nach dem Login kopieren

Dies ist gültig, weil ref einen regulären Parameter ändert.

Die Einschränkung auf ref this

Die Einschränkung entsteht, wenn ref auf den this-Parameter angewendet wird:

<code class="language-csharp">public static void ModifyExtension(this ref int x, int y) { x = y; } //Compiler Error</code>
Nach dem Login kopieren

Dies erzeugt einen Compilerfehler.

Historischer Kontext (vor C# 7.2)

Vor C# 7.2 war diese Einschränkung auf Compiler-Einschränkungen zurückzuführen. Der Compiler hat den this-Parameter unterschiedlich behandelt und so die ref-Semantik verhindert.

C# 7.2 und höher: Aktivieren von ref this

C# 7.2 hat diese Einschränkung behoben. Jetzt kann ref mit dem Parameter this verwendet werden, was besonders nützlich für die Änderung von Werttypen (Strukturen) ist.

Praktische Anwendung: Strukturen ändern

Diese Funktion erweist sich bei der Arbeit mit Strukturen als unschätzbar wertvoll, da sie direkte Änderungen innerhalb von Erweiterungsmethoden ermöglicht. Zum Beispiel:

<code class="language-csharp">public struct MyData
{
    public string Value { get; set; }
}

public static class MyDataExtensions
{
    public static void UpdateValue(this ref MyData data, string newValue)
    {
        data.Value = newValue;
    }
}</code>
Nach dem Login kopieren

Hier ändert UpdateValue direkt die Value-Eigenschaft der MyData-Struktur. Dadurch wird die Erstellung einer neuen Strukturinstanz vermieden und die Leistung verbessert.

Das obige ist der detaillierte Inhalt vonWarum kann „ref' nicht mit dem Parameter „this' in C#-Erweiterungsmethoden (vor C# 7.2) verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage