Справочник по C#. Операторы присваивания
Оператор =
присваивания присваивает значение правого операнда переменной, свойству или элементу индексатора , заданному левой операндом. Результатом выражения присваивания является значение, назначенное расположенному слева операнду. Расположенный справа операнд должен иметь тот же тип, что и операнд слева, либо же допускать неявное преобразование в этот тип.
Оператор присваивания =
имеет правую ассоциативность, то есть выражение формы:
a = b = c
вычисляется как
a = (b = c)
В следующем примере показано использование оператора присваивания с локальной переменной, свойством и элементом индексатора в качестве левого операнда:
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
Левый операнд назначения получает значение правого операнда. Если операнды имеют типы значений, назначение копирует содержимое правого операнда. Если операнды имеют ссылочные типы, назначение копирует ссылку на объект.
Это называется назначением значений: присваивается значение.
Назначение ссылок
Назначение = ref
Ref делает его левый операнд псевдонимом правой операнда, как показано в следующем примере:
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
В предыдущем примере локальная ссылочная переменная arrayElement
инициализируется как псевдоним первого элемента массива. Затем он ref
переназначется для ссылки на последний элемент массива. Как это псевдоним, при обновлении его значения с помощью обычного оператора =
присваивания соответствующий элемент массива также обновляется.
Левый операнд ref
назначения может быть локальной ссылочной переменной, ref
полем и параметром метода или in
методомref
out
. Оба операнда должны иметь одинаковый тип.
Составное присваивание
Для бинарного оператора op
выражение составного присваивания в форме
x op= y
эквивалентно правилу
x = x op y
за исключением того, что x
вычисляется только один раз.
Составное присваивание поддерживается арифметическими, логическими, побитовыми логическими операторами и операторами смещения.
Присваивание объединения со значением NULL
Можно использовать оператор ??=
присваивания назначения null-mergeescing, чтобы назначить значение правого операнда левой операнда только в том случае, если левый операнд оценивается null
. Дополнительные сведения см. в статье Операторы ?? и ??=.
Возможность перегрузки оператора
Определяемый пользователем тип не может перегружать оператор назначения. Однако пользовательский тип может определять неявное преобразование в другой тип. Таким образом, значение пользовательского типа может быть присвоено переменной, свойству или элементу индексатора другого типа. Дополнительные сведения см. в разделе Операторы пользовательского преобразования.
Явная перегрузка составного оператора присваивания для пользовательского типа невозможна. Но если пользовательский тип перегружает бинарный оператор op
, существующий оператор op=
также будет неявно перегружен.
Спецификация языка C#
Подробные сведения см. в разделе Assignment operators (Операторы присваивания) в спецификации языка C#.