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