Zuweisungsoperatoren (C#-Referenz)
Der Zuweisungsoperator =
weist den Wert seines rechtsseitigen Operanden einer Variablen, einer Eigenschaft oder einem durch seinen linksseitigen Operanden angegebenen Indexer-Element zu. Das Ergebnis eines Zuweisungsausdrucks ist der Wert, der dem linksseitigen Operanden zugewiesen wird. Der Typ des rechtsseitigen Operanden muss mit dem Typ des linksseitigen Operanden übereinstimmen oder implizit in ihn konvertierbar sein.
Der Zuweisungsoperator =
ist rechtsassoziativ, d. h. ein Ausdruck der Form
a = b = c
Wird ausgewertet als
a = (b = c)
Das folgende Beispiel zeigt die Verwendung des Zuweisungsoperators mit einer lokalen Variablen, einer Eigenschaft und einem Indexerelement als linksseitigem Operanden:
List<double> numbers = [1.0, 2.0, 3.0];
Console.WriteLine(numbers.Capacity);
numbers.Capacity = 100;
Console.WriteLine(numbers.Capacity);
// Output:
// 4
// 100
int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
Console.WriteLine(originalFirstElement);
Console.WriteLine(numbers[0]);
// Output:
// 1
// 5
Der linke Operand einer Zuweisung empfängt den Wert des rechten Operanden. Wenn die Operanden Werttypen angehören, kopiert die Zuweisung den Inhalt des rechten Operanden. Wenn die Operanden Verweistypen sind, kopiert die Zuweisung den Verweis auf das Objekt.
Dieser Vorgang wird als Wertzuweisung bezeichnet: der Wert wird zugewiesen.
Ref-Zuweisung
Die Ref-Zuweisung= ref
macht den linken Operanden zu einem Alias für den rechten Operanden, wie das folgende Beispiel zeigt:
void Display(double[] s) => Console.WriteLine(string.Join(" ", s));
double[] arr = { 0.0, 0.0, 0.0 };
Display(arr);
ref double arrayElement = ref arr[0];
arrayElement = 3.0;
Display(arr);
arrayElement = ref arr[arr.Length - 1];
arrayElement = 5.0;
Display(arr);
// Output:
// 0 0 0
// 3 0 0
// 3 0 5
Im vorstehenden Beispiel wird die lokale VerweisvariablearrayElement
als Alias für das erste Arrayelement initialisiert. Anschließend wird ihr ref
erneut zugewiesen, sodass sie auf das letzte Arrayelement verweist. Da es sich um einen Alias handelt, wird beim Aktualisieren des Werts mit einem normalen Zuweisungsoperator =
das entsprechende Arrayelement ebenfalls aktualisiert.
Der linke Operand der Zuweisung ref
kann eine lokale Verweisvariable, ein ref
-Feld und ein ref
-, out
- oder in
-Methodenparameter sein. Beide Operanden müssen vom gleichen Typ sein.
Eine ref
Zuordnung bedeutet, dass eine Referenzvariable einen anderen Verweis hat. Es verweist nicht mehr auf seine vorherige Referenz. Die Verwendung von ref =
für einen ref
-Parameter bedeutet, dass der Parameter nicht mehr auf sein Argument verweist. Alle Aktionen, die den Status des Objekts ändern, nachdem das Objekt neu zugewiesen wurde, nehmen diese Änderungen am neuen Element vor. Betrachten Sie beispielsweise die folgende Methode:
private static void RefReassignAndModify(scoped ref string s)
{
string sLocal = "Hello";
Console.WriteLine(sLocal); // Output: Hello
s = ref sLocal;
s = "World";
Console.WriteLine(s); // Output: World
Die folgende Verwendung zeigt, dass die Zuordnung zum Parameter s
nach dem Methodenaufruf nicht sichtbar ist, da s
ref
neu zugewiesen wurde, um auf sLocal
zu verweisen, bevor die Zeichenfolge geändert wurde:
string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!
Verbundzuweisung
Bei einem binären Operator op
entspricht ein Verbundzuweisungsausdruck der Form
x op= y
Ist gleichwertig mit
x = x op y
Außer dass x
nur einmal ausgewertet wird.
Die arithmetischen, logischen booleschen und bitweisen logischen und Verschiebungs--Operatoren unterstützen alle Verbundzuweisungen.
NULL-Coalescing-Zuweisung
Sie können den NULL-Coalescing-Zuweisungsoperator ??=
verwenden, um den Wert des rechten Operanden dem linken Operanden nur dann zuzuweisen, wenn die Auswertung des linken Operanden null
ergibt. Weitere Informationen finden Sie im Artikel zu den Operatoren ?? und ??=.
Operatorüberladbarkeit
Ein benutzerdefinierter Typ kann den Zuweisungsoperator nicht überladen. Ein benutzerdefinierter Typ kann jedoch eine implizite Konvertierung in einen anderen Typ definieren. Auf diese Weise kann der Wert eines benutzerdefinierten Typs einer Variablen, einer Eigenschaft oder einem Indexerelement eines anderen Typs zugewiesen werden. Weitere Informationen finden Sie unter Benutzerdefinierte Konvertierungsoperatoren.
Ein benutzerdefinierter Typ kann einen Verbundzuweisungsoperator nicht explizit überladen. Wenn jedoch ein benutzerdefinierter Typ einen binären op
-Operator überlädt, wird der op=
-Operator, sofern vorhanden, ebenfalls implizit überladen.
C#-Sprachspezifikation
Weitere Informationen finden Sie im Abschnitt Zuweisungsoperatoren der C#-Sprachspezifikation.