Freigeben über


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.

Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie eine erste Dokumentation zu Funktionen in der öffentlichen Vorschau für die kommende Sprachversion.

In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.

Tipp

Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.

Der Zuordnungsoperator = ist rechtsassoziativ, was einen Ausdruck des Formulars bedeutet.

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.

Ab C# 14 kann die linke Seite einer Wertzuweisung einen null-bedingten Memberausdruck enthalten, z.B. ?. oder ?[]. Wenn die linke Seite null ist, wird der rechte Ausdruck nicht ausgewertet.

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 Referent aufweist. Er verweist nicht mehr auf seinen vorherigen Referent. 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 sref 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, booleschen logischen und bitweisen logischen Operatoren und Schichtoperatoren unterstützen alle zusammengesetzte Zuordnungen.

NULL-Coalescing-Zuweisung

Verwenden Sie den Zuordnungsoperator ??= null-kohlencing, um den Wert des rechten Operanden nur dem linken Operanden zuzuweisen, wenn der linke Operand ausgewertet wird null. Weitere Informationen finden Sie im Artikel zu den ?? und ??=-Operatoren.

Operatorüberladbarkeit

Ein benutzerdefinierter Typ kann den Zuweisungsoperator nicht überladen. Ein benutzerdefinierter Typ kann jedoch eine implizite Konvertierung in einen anderen Typ definieren. Mithilfe dieser Konvertierung können Sie einem Variablen, einer Eigenschaft oder einem Indexerelement eines anderen Typs den Wert eines benutzerdefinierten Typs zuweisen. Weitere Informationen finden Sie unter Benutzerdefinierte Konvertierungsoperatoren.

Wenn ein benutzerdefinierter Typ einen binären Operator opüberlastet, wird auch der op= Operator implizit überladen. Ab C# 14 kann ein benutzerdefinierter Typ die zusammengesetzten Zuordnungsoperatoren (op=) explizit überladen, um eine effizientere Implementierung bereitzustellen. In der Regel überlastet ein Typ diese Operatoren, da der Wert direkt aktualisiert werden kann, anstatt eine neue Instanz zuzuweisen, um das Ergebnis des binären Vorgangs zu speichern. Wenn ein Typ keine explizite Überladung bereitstellt, generiert der Compiler die implizite Überladung.

C#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt "Zuordnungsoperatoren " der C#-Sprachspezifikation und der Spezifikation der benutzerdefinierten Verbundzuweisungsfunktion .

Weitere Informationen