Оператор присваивания си шарп

Операторы и выражения C# (справочник по C#)

C# предоставляет ряд операторов. Многие из них поддерживаются встроенными типами и позволяют выполнять базовые операции со значениями этих типов. В число этих операторов входят следующие группы:

  • Арифметические операторы, выполняющие арифметические операции с числовыми операндами.
  • Операторы сравнения, сравнивающие числовые операнды.
  • Логические операторы, выполняющие логические операции с операндами bool .
  • Битовые операторы и операторы сдвига выполняют битовые операции или операции сдвига с операндами целочисленных типов.
  • Операторы равенства проверяют равенство или неравенство своих операндов.

Как правило, можно выполнить перегрузку этих операторов, то есть указать поведение оператора для операндов определяемого пользователем типа.

Простейшими выражениями C# являются литералы (например, целые и реальные числа) и имена переменных. Их можно объединить в сложные выражения с помощью операторов. Приоритет и ассоциативность операторов определяют порядок выполнения операций в выражении. Порядок вычисления, определяемый приоритетом и ассоциативностью операторов, можно изменить с помощью скобок.

В следующем коде примеры выражений находятся в правой части назначений:

int a, b, c; a = 7; b = a; c = b++; b = a + b * c; c = a >= 100 ? b : c / 10; a = (int)Math.Sqrt(b * b + c * c); string s = "String literal"; char l = s[s.Length - 1]; var numbers = new List(new[] < 1, 2, 3 >); b = numbers.FindLast(n => n > 1); 

Как правило, выражение выдает результат и может быть заключено в другое выражение. Вызов метода void является примером выражения, которое дает результат. Его можно использовать только в качестве оператора, как показано в следующем примере:

Console.WriteLine("Hello, world!"); 

Ниже приведены некоторые другие виды выражений, доступные в C#:

Читайте также:  Css cursor text color

    Выражения интерполированных строк, которые предоставляют удобный синтаксис для создания форматированных строк:

var r = 2.3; var message = $"The area of a circle with radius is ."; Console.WriteLine(message); // Output: // The area of a circle with radius 2.3 is 16.619. 
int[] numbers = < 2, 3, 4, 5 >; var maximumSquare = numbers.Max(x => x * x); Console.WriteLine(maximumSquare); // Output: // 25 
var scores = new[] < 90, 97, 78, 68, 85 >; IEnumerable highScoresQuery = from score in scores where score > 80 orderby score descending select score; Console.WriteLine(string.Join(" ", highScoresQuery)); // Output: // 97 90 85 

Определение тела выражения можно использовать, чтобы предоставить краткое определение для метода, конструктора, свойства, индексатора или метода завершения.

Приоритет операторов

В выражении с несколькими операторами операторы с более высоким приоритетом оцениваются до операторов с более низким приоритетом. В следующем примере умножение выполняется сначала, так как оно имеет более высокий приоритет, чем сложение:

var a = 2 + 2 * 2; Console.WriteLine(a); // output: 6 

Используйте скобки, чтобы изменить порядок вычисления, накладываемый приоритетом операторов:

var a = (2 + 2) * 2; Console.WriteLine(a); // output: 8 

В следующей таблице перечислены операторы C# в порядке убывания приоритета. Операторы в каждой строке имеют одинаковый приоритет.

Операторы Категория или имя
x.y, f(x), a[i], x?.y , x?[y] x++, x—, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> Основной
+x, -x, !x, ~x, ++x, —x, ^x, ^x, (T)x, await, &x, *x, true и false Унарный
x..y Диапазон
switch, with Выражения switch и with
x * y, x / y, x % y Мультипликативный
x + y, x – y Аддитивный
x > y Сдвиг
x < y, x y, x >= y, is, as Тестирование типов и относительный
x == y, x != y Равенство
x & y Логическое И или побитовое логическое И
x ^ y Логическое исключающее ИЛИ или побитовое логическое исключающее ИЛИ
x | y Логическое ИЛИ или побитовое логическое ИЛИ
x && y Условное И
x || Y Условное ИЛИ
X?? да Оператор объединения с NULL
C? t : f Условный оператор
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x = y, x &|= y, x ^= y, x >= y, x ?? = y, => Назначение и объявление лямбда-выражений

Ассоциативность операторов

Если операторы имеют одинаковый приоритет, порядок их выполнения определяется ассоциативностью операторов:

  • Операторы с левой ассоциативностью вычисляются слева направо. За исключением операторов присваивания и оператора объединения со значением NULL, все бинарные операторы имеют левую ассоциативность. Например, выражение a + b — c вычисляется как (a + b) — c .
  • Операторы с правой ассоциативностью вычисляются справа налево. Операторы присваивания, операторы объединения null, лямбда-выражения и условные операторы ?: являются правильными ассоциативными. Например, выражение x = y = z вычисляется как x = (y = z) .

Используйте скобки, чтобы изменить порядок вычисления, накладываемый ассоциативностью операторов:

int a = 13 / 5 / 2; int b = 13 / (5 / 2); Console.WriteLine($"a = , b = "); // output: a = 1, b = 6 

Вычисление операнда

Не связанные с приоритетом и ассоциативностью операторов операнды в выражении вычисляются слева направо. В следующих примерах иллюстрируется порядок вычисления операторов и операндов:

Выражение Порядок вычислений
a + b a, b, +
a + b * c a, b, c, *, +
a / b + c * d a, b, /, c, d, *, +
a / (b + c) * d a, b, c, +, /, d, *

Как правило, оцениваются все операнды операторов. Однако некоторые операторы оценивают операнды условно. То есть значение крайнего левого операнда такого оператора определяет, следует ли оценивать другие операнды. Эти операторы являются условными логическими операторами И ( && ) и ИЛИ ( || ) , операторами объединения со значением NULL ?? и ??= , условными операторами со значением NULL ?. и ?[] и условным оператором ?: . Дополнительные сведения см. в описании каждого оператора.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

См. также

Источник

Assignment operators (C# reference)

The assignment operator = assigns the value of its right-hand operand to a variable, a property, or an indexer element given by its left-hand operand. The result of an assignment expression is the value assigned to the left-hand operand. The type of the right-hand operand must be the same as the type of the left-hand operand or implicitly convertible to it.

The assignment operator = is right-associative, that is, an expression of the form

The following example demonstrates the usage of the assignment operator with a local variable, a property, and an indexer element as its left-hand operand:

var numbers = new List() < 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 

The left-hand operand of an assignment receives the value of the right-hand operand. When the operands are of value types, assignment copies the contents of the right-hand operand. When the operands are of reference types, assignment copies the reference to the object.

This is called value assignment: the value is assigned.

ref assignment

Ref assignment = ref makes its left-hand operand an alias to the right-hand operand, as the following example demonstrates:

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 

In the preceding example, the local reference variable arrayElement is initialized as an alias to the first array element. Then, it’s ref reassigned to refer to the last array element. As it’s an alias, when you update its value with an ordinary assignment operator = , the corresponding array element is also updated.

The left-hand operand of ref assignment can be a local reference variable, a ref field, and a ref , out , or in method parameter. Both operands must be of the same type.

Compound assignment

For a binary operator op , a compound assignment expression of the form

except that x is only evaluated once.

Compound assignment is supported by arithmetic, Boolean logical, and bitwise logical and shift operators.

Null-coalescing assignment

You can use the null-coalescing assignment operator ??= to assign the value of its right-hand operand to its left-hand operand only if the left-hand operand evaluates to null . For more information, see the ?? and ??= operators article.

Operator overloadability

A user-defined type can’t overload the assignment operator. However, a user-defined type can define an implicit conversion to another type. That way, the value of a user-defined type can be assigned to a variable, a property, or an indexer element of another type. For more information, see User-defined conversion operators.

A user-defined type can’t explicitly overload a compound assignment operator. However, if a user-defined type overloads a binary operator op , the op= operator, if it exists, is also implicitly overloaded.

C# language specification

For more information, see the Assignment operators section of the C# language specification.

See also

Источник

Справочник по C#. Операторы присваивания

Оператор = присваивания присваивает значение правого операнда переменной, свойству или элементу индексатора , заданному левым операндом. Результатом выражения присваивания является значение, назначенное расположенному слева операнду. Расположенный справа операнд должен иметь тот же тип, что и операнд слева, либо же допускать неявное преобразование в этот тип.

Оператор присваивания = имеет правую ассоциативность, то есть выражение формы:

В следующем примере показано использование оператора присваивания с локальной переменной, свойством и элементом индексатора в качестве левого операнда:

var numbers = new List() < 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 ссылки делает его левый операнд псевдонимом правого операнда, как показано в следующем примере:

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 . Оба операнда должны иметь один и тот же тип.

Составное присваивание

Для бинарного оператора op выражение составного присваивания в форме

за исключением того, что x вычисляется только один раз.

Присваивание объединения со значением NULL

Оператор ??= присваивания с объединением значений NULL можно использовать для назначения значения правого операнда левому операнду только в том случае, если левый операнд имеет значение null . Дополнительные сведения см. в статье Операторы ?? и ??=.

Возможность перегрузки оператора

Определяемый пользователем тип не может перегружать оператор присваивания. Однако пользовательский тип может определять неявное преобразование в другой тип. Таким образом, значение пользовательского типа может быть присвоено переменной, свойству или элементу индексатора другого типа. Дополнительные сведения см. в разделе Операторы пользовательского преобразования.

Явная перегрузка составного оператора присваивания для пользовательского типа невозможна. Но если пользовательский тип перегружает бинарный оператор op , существующий оператор op= также будет неявно перегружен.

Спецификация языка C#

Подробные сведения см. в разделе Assignment operators (Операторы присваивания) в спецификации языка C#.

См. также

Источник

Оцените статью