Справочник по 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
полем и параметром метода или ref
методомout
in
. Оба операнда должны иметь одинаковый тип.
Назначение ref
означает, что ссылочная переменная имеет другую ссылку. Он больше не ссылается на предыдущий референт. Использование ref =
в параметре ref
означает, что параметр больше не ссылается на его аргумент. Все действия, изменяющие состояние объекта после переназначения объекта, вносят эти изменения в новый элемент. Например, рассмотрим следующий метод:
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
Следующее использование показывает, что назначение параметру s
не отображается после вызова метода, так как s
ref
был переназначен, чтобы ссылаться на sLocal
до изменения строки:
string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!
Составное присваивание
Для бинарного оператора op
выражение составного присваивания в форме
x op= y
Эквивалентен
x = x op y
За исключением того, что x
оценивается только один раз.
Арифметические
Присваивание объединения со значением NULL
Можно использовать оператор ??=
присваивания назначения null-mergeescing, чтобы назначить значение правого операнда левой операнда только в том случае, если левый операнд оценивается null
. Дополнительные сведения см. в статье Операторы ?? и ??=.
Возможность перегрузки оператора
Определяемый пользователем тип не может перегружать оператор назначения. Однако пользовательский тип может определять неявное преобразование в другой тип. Таким образом, значение пользовательского типа может быть присвоено переменной, свойству или элементу индексатора другого типа. Дополнительные сведения см. в разделе Операторы пользовательского преобразования.
Явная перегрузка составного оператора присваивания для пользовательского типа невозможна. Но если пользовательский тип перегружает бинарный оператор op
, существующий оператор op=
также будет неявно перегружен.
Спецификация языка C#
Подробные сведения см. в разделе Assignment operators (Операторы присваивания) в спецификации языка C#.