Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Оператор =
присваивания присваивает значение правого операнда переменной, свойству или элементу индексатора , заданному левой операндом. Результатом выражения присваивания является значение, присвоенное левому операнду. Операнд справа должен иметь тот же тип, что и операнд слева, или иметь возможность неявного преобразования в этот тип.
Оператор присваивания =
имеет правую ассоциативность, то есть выражение такого вида:
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
Левый операнд присваивания получает значение правого операнда. Если операнды имеют значимые типы, присваивание копирует содержимое правого операнда. Если операнды имеют ссылочные типы, назначение копирует ссылку на объект.
Эта операция называется назначением значений: присваивается значение.
Начиная с C# 14, левая часть назначения значения может включать выражение условного члена NULL, например ?.
или ?[]
. Если левая сторона имеет значение NULL, выражение правой стороны не вычисляется.
Назначение ссылок
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-объединения ??=
, чтобы присвоить значение правого операнда левому операнду только в том случае, если левый операнд оценивается как null
. Дополнительные сведения см. в статье ??
и ??=
операторах.
Возможность перегрузки оператора
Определяемый пользователем тип не может перегружать оператор назначения. Однако пользовательский тип может определять неявное преобразование в другой тип. Таким образом, значение пользовательского типа может быть присвоено переменной, свойству или элементу индексатора другого типа. Дополнительные сведения см. в разделе Операторы пользовательского преобразования.
Если определяемый пользователем тип перегружает двоичный оператор op
, op=
оператор, если он существует, также неявно перегружен. Начиная с C# 14 определяемый пользователем тип может явно перегружать операторы составных назначений (op=
) для обеспечения более эффективной реализации. Как правило, тип перегружает эти операторы, так как значение можно обновить на месте, а не распределить новый экземпляр для хранения результата двоичной операции. Если тип не предоставляет явной перегрузки, компилятор создает неявную перегрузку.
Спецификация языка C#
Дополнительные сведения см. в разделе "Операторы назначения " спецификации языка C# и спецификации определяемой пользователем функции составного назначения .