Sdílet prostřednictvím


Operátory přiřazení (referenční dokumentace jazyka C#)

Operátor = přiřazení přiřadí hodnotu jeho pravého operandu proměnné, vlastnosti nebo prvku indexeru zadaného jeho levým operandem. Výsledkem výrazu přiřazení je hodnota přiřazená k levému operandu. Typ pravého operandu musí být stejný jako typ levého operandu nebo implicitně převést na něj.

Operátor = přiřazení je asociativní, tedy výraz formuláře.

a = b = c

Je hodnoceno jako

a = (b = c)

Následující příklad ukazuje použití operátoru přiřazení s místní proměnnou, vlastností a indexer element jako jeho levý operand:

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

Levý operand přiřazení obdrží hodnotu operandu pravého operandu. Pokud jsou operandy hodnotových typů, přiřazení zkopíruje obsah pravého operandu. Pokud jsou operandy typu odkazu, přiřazení zkopíruje odkaz na objekt.

Tato operace se nazývá přiřazení hodnoty: tato hodnota je přiřazena.

přiřazení odkazu

Přiřazení= ref odkazu vytvoří z levého operandu alias pravého operandu, jak ukazuje následující příklad:

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

V předchozím příkladu je místní referenční proměnnáarrayElement inicializována jako alias prvního prvku pole. Potom se ref znovu přiřazuje, aby odkazoval na poslední prvek pole. Protože se jedná o alias, při aktualizaci jeho hodnoty pomocí běžného operátoru =přiřazení je také aktualizován odpovídající prvek pole.

Levým operandem ref přiřazení může být místní referenční proměnná,refpole a refparametr metody , outnebo in metoda. Oba operandy musí být stejného typu.

Přiřazení ref znamená, že referenční proměnná má jinou referenční hodnotu. Již neodkazuje na svůj předchozí referent. Použití ref = u parametru ref znamená, že parametr už nebude odkazovat na jeho argument. Všechny akce, které upravují stav objektu po opakovaném přiřazení reference, provádějí tyto změny novému objektu. Představte si například následující metodu:

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

Následující použití ukazuje, že přiřazení k parametru s není viditelné po volání metody, protože s bylo ref znovu přiřazeno, aby odkazovalo na sLocal před úpravou řetězce:

string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!

Složené přiřazení

U binárního operátoru opje složený výraz přiřazení formuláře.

x op= y

Je ekvivalentní

x = x op y

Kromě toho, že x se vyhodnotí jenom jednou.

aritmetické, logické, a bitové logické a posunové operátory všechny podporují kompozitní přiřazení.

Přiřazení při souhlásání s hodnotou null

Operátor přiřazení s hodnotou null-coalescing můžete ??= použít k přiřazení hodnoty jeho pravého operandu k jeho levému operandu pouze v případě, že se operand vlevo vyhodnotí jako null. Další informace najdete v tématech ?? a ?? = operátory článku.

Přetížení operátoru

Uživatelem definovaný typ nemůže přetížit operátor přiřazení. Uživatelem definovaný typ však může definovat implicitní převod na jiný typ. Tímto způsobem lze hodnotu uživatelem definovaného typu přiřadit proměnné, vlastnosti nebo prvku indexeru jiného typu. Další informace naleznete v tématu Uživatelem definované operátory převodu.

Uživatelem definovaný typ nemůže explicitně přetížit operátor složeného přiřazení. Nicméně, pokud uživatelem definovaný typ přetíží binární operátor op, op= operátor, pokud existuje, je také implicitně přetížen.

specifikace jazyka C#

Další informace najdete v části Operátory přiřazení specifikace jazyka C#.

Viz také