Heim > Backend-Entwicklung > C++ > Warum kann der erste Parameter einer C#-Erweiterungsmethode kein „ref'-Parameter sein?

Warum kann der erste Parameter einer C#-Erweiterungsmethode kein „ref'-Parameter sein?

Barbara Streisand
Freigeben: 2025-01-07 16:57:42
Original
1023 Leute haben es durchsucht

Why Can't the First Parameter of a C# Extension Method Be a `ref` Parameter?

C#-Erweiterungsmethoden: Warum der erste Parameter nicht ref sein kann (meistens)

Erweiterungsmethoden fügen vorhandenen Typen auf elegante Weise Funktionalität hinzu, ohne deren Quellcode zu ändern. Es besteht jedoch eine wesentliche Einschränkung: Der erste Parameter – der die Instanz darstellt, auf die die Methode angewendet wird – kann kein ref-Parameter sein (mit den unten aufgeführten Ausnahmen).

Der Grund für die Einschränkung

Das Schlüsselwort ref ermöglicht einer Methode, den Wert einer als Argument übergebenen Variablen direkt zu ändern. Bei einem Standardmethodenaufruf ist dies vollkommen akzeptabel. Bei Erweiterungsmethoden stellt der erste Parameter jedoch implizit das Objekt dar, für das die Erweiterung aufgerufen wird. Das Festlegen dieses Parameters ref würde die Funktionsweise von Erweiterungsmethoden grundlegend ändern.

Eine Erweiterungsmethode erweitertdas Verhalten eines Typs; Es ersetzt oder erstellt keine neue Instanz. Das Zulassen eines ref-Parameters für das erste Argument würde es der Erweiterungsmethode effektiv ermöglichen, das ursprüngliche Objekt durch ein völlig anderes zu ersetzen, was das Kernkonzept der Erweiterungsmethoden zerstören würde.

Anschauliches Beispiel

Stellen Sie sich eine normale Methode vor:

<code class="language-csharp">public static void Modify(ref MyClass obj, MyClass newObj)
{
    obj = newObj; //Directly replaces the original object
}</code>
Nach dem Login kopieren

Stellen Sie sich nun eine analoge Erweiterungsmethode vor (hypothetisch zulässig):

<code class="language-csharp">public static void ModifyExtension(this ref MyClass obj, MyClass newObj)
{
    obj = newObj; //Would replace the original object
}</code>
Nach dem Login kopieren

Diese hypothetische Erweiterungsmethode würde die ursprüngliche obj nicht ändern, sondern stattdessen der Variablen, die darauf verweist, ein neues Objekt zuweisen. Dieses Verhalten steht im Widerspruch zum beabsichtigten Zweck von Erweiterungsmethoden.

C# 7.2 und Werttypen: Eine Ausnahme

Während die Einschränkung im Allgemeinen für Referenztypen (Klassen, Schnittstellen) gilt, führte C# 7.2 eine Ausnahme für Werttypen (Strukturen) ein. Bei Strukturen ist die Verwendung von ref für den ersten Parameter zulässig.

Dies ermöglicht das Erstellen von Erweiterungsmethoden, die den internen Status einer Struktur ändern können. Beachten Sie jedoch unbedingt, dass diese Ausnahme nur für Werttypen und nicht für Referenztypen gilt. Das Kernprinzip der Beibehaltung der Originalinstanz bleibt für Referenztypen bestehen.

Das obige ist der detaillierte Inhalt vonWarum kann der erste Parameter einer C#-Erweiterungsmethode kein „ref'-Parameter sein?. 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