Операторы и выражения 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#:

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

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 + ba, b, +
a + b * ca, b, c, *, +
a / b + c * da, b, /, c, d, *, +
a / (b + c) * da, b, c, +, /, d, *

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

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

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

См. также

char (Справочник по C#)

Ключевое слово типа char — это псевдоним для типа структуры System.Char .NET, представляющий символ UTF-16 в Юникоде.

Значение по умолчанию для типа char — \0 , то есть U+0000.

Тип char поддерживает сравнение, проверку равенства, а также операции инкремента и декремента. Кроме того, для операндов char арифметические и побитовые логические операторы выполняют операцию с соответствующими кодами символов и создают результат типа int .

Тип string представляет текст как последовательность значений char .

Литералы

Значение char можно указать следующим образом:

  • символьный литерал;
  • escape-последовательность Юникода, то есть символы \u , за которыми следует шестнадцатеричное представление кода символа из четырех символов;
  • шестнадцатеричная escape-последовательность, то есть символы \x , за которыми следует шестнадцатеричное представление кода символа.
var chars = new[] < 'j', '\u006A', '\x006A', (char)106, >; Console.WriteLine(string.Join(" ", chars)); // output: j j j j 

Как показано в предыдущем примере, можно также привести значение кода символа к соответствующему значению char .

В случае escape-последовательности Юникода необходимо указать все четыре шестнадцатеричные цифры. То есть \u006A — допустимая escape-последовательность, а \u06A и \u6A нет.

В случае шестнадцатеричной escape-последовательности начальные нули можно опустить. То есть \x006A , \x06A и \x6A — допустимые escape-последовательности, соответствующие одному символу.

Преобразования

Тип char неявно преобразуется в следующие целочисленные типы: ushort , int , uint , long и ulong . Он также может быть неявно преобразован во встроенные числовые типы с плавающей запятой: float , double и decimal . Он явно преобразуется в целочисленные типы sbyte , byte и short .

Неявные преобразования из других типов в тип char не предусмотрены. Но любой целочисленный тип или числовой тип с плавающей запятой явно преобразуется в char .

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

Дополнительные сведения см. в разделе Целочисленные типы в статье Спецификации языка C#.

См. также

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

Символьний тип даних char . Структура System.Char . Методи структури System.Char

В .NET Framework тип даних char введено для представлення окремого символу. Кожен символ кодується в форматі Unicode. Формат Unicode передбачає використання кодової форми UTF-16, в якій кожен символ представлений 16-бітним числовим додатнім значенням.

Розрядність в 16 біт (а не 8 біт, як було раніше) пояснюється тим, що потрібно забезпечити представлення широких наборів символів у деяких мовах. Наприклад, в китайській мові кількість використовуваних символів неможливо помістити в кількість можливих варіантів значень, які дає 8-бітне представлення символу.

У мові C# кожне 16-бітне значення представлене діапазоном від 0x0000 до 0xFFFF і розміщується в структурі System.Char .

Структура System.Char представляє методи, які групуються за наступними ознаками:

  • порівняння об’єктів типу char ;
  • конвертування поточного char -об’єкту в об’єкт іншого типу;
  • перетворення регістру символу;
  • визначення категорії поточного символу.
2. Оголошення змінної типу char . Приклади символьних констант типу char

Тип даних char може представляти різні види символів:

  • символи які відбражаються на клавіатурі;
  • спеціальні керуючі символи, такі як ‘\n’ , ‘\b’ , ‘\t’ та інші.

Нижче наведено приклади оголошення змінної типу char та використання деяких символьних констант

char c1; // Оголошення змінної типу char char c2 = '\x173'; // Оголошення з ініціалізацією c1 = ' '; // символ пробіл c1 = '\x20'; // символ пробіл у вигляді коду в 16-й системі числення c2 = '\n'; // символ нового рядка c2 = 'Z'; // літера Z верхнього регістру c2 = 'z'; // літера z нижнього регістру
3. Як визначити код символу типу char . Приклад

Щоб визначити код символу типу char потрібно реалізувати операцію явного приведення типу, як показано нижче.

char c = '\x20'; // Оголошення з ініціалізацією uint code; code = (uint)c; // code = 32 (у десятковій системі числення) c = '\n'; code = (uint)c; // code = 10 c = 'D'; code = (uint)c; // code = 68
4. Приклади методів, що реалізовані в структурі типу Char

Тип char є псевдонімом структури типу System.Char , яка має ряд методів. Нижче перераховано основні з них.

4.1. Метод IsControl() . Визначення, чи символ є керуючим символом

Метод IsControl() визначає, чи символ відноситься до категорії керуючих символів згідно з кодуванням Unicode. До керуючих символів відносяться ‘\n’ , ‘\t’ , ‘\b’ та інші. Метод повертає значення типу bool і має дві перевантажені реалізації.

Загальна форма першої реалізації методу наступна:

  • c – символ, який перевіряється. Якщо символ c є керуючим (управляючим), то функція повертає true .

Загальна форма другої реалізації методу наступна:

bool char.IsControl(string s, int index);
  • s – рядок, в якому відбувається перевірка;
  • index – позиція символу в рядку s , для якого здійснюється перевірка. Якщо символ c є керуючим, то функція повертає true .
// Визначити, чи символ є управляючим bool fRes; fRes = char.IsControl('.'); // fRes = false fRes = char.IsControl('\t'); // fRes = true fRes = char.IsControl('\\'); // fRes = false fRes = char.IsControl('\n'); // fRes = true // Чи символ в заданій позиції заданого рядка є управляючим fRes = char.IsControl("abcd\nghi", 4); // fRes = true fRes = char.IsControl("abcd\nghi", 3); // fRes = false
4.2. Метод IsDigit() . Визначення, чи символ є цифрою

Метод IsDigit() призначений для визначення того, чи є символ цифрою. Метод має дві перевантажені реалізації:

bool char.IsDigit(char c); bool char.IsDigit(string s, int index);
  • c – символ, що перевіряється;
  • s – рядок, в якому перевіряється символ в позиції index . Вказаний символ має позначення s[index] .

Якщо вказаний символ є цифрою, то функція повертає true .

// 2. Визначити, чи символ є цифрою bool fRes; char c = '7'; fRes = System.Char.IsDigit(c); // fRes = true fRes = char.IsDigit('a'); // fRes = false fRes = char.IsDigit('.'); // fRes = false fRes = char.IsDigit("550", 0); // fRes = true fRes = char.IsDigit("A50", 0); // fRes = false
4.3. Метод IsLetter() . Визначення, чи символ є буквеним

Метод IsLetter() повертає true , якщо заданий символ є буквеним. Символ задається однією з двох перевантажених реалізацій методу

bool char.IsLetter(char c); bool char.IsLetter(string s, int index);
// Визначити, чи символ є буквеним bool fRes; fRes = char.IsLetter('z'); // fRes = true fRes = char.IsLetter(';'); // fRes = false fRes = System.Char.IsLetter('\n'); // fRes = false fRes = char.IsLetter("\na+-8", 1); // fRes = true fRes = char.IsLetter("\na+-8", 2); // fRes = false
4.4. Метод IsLower() . Визначення, чи знаходиться символ у нижньому регістрі

Метод IsLower() повертає значення true , якщо заданий символ знаходиться у нижньому регістрі. Метод має дві перевантажені реалізації

bool char.IsLower(char c); bool char.IsLower(string s, int index);
// Визначити, чи знаходиться символ у нижньому регістрі bool fRes; fRes = char.IsLower('Z'); // fRes = false fRes = char.IsLower(';'); // fRes = false fRes = char.IsLower("hELLO wORLD!", 0); // fRes = true fRes = char.IsLower("ABCD", 2); // fRes = false
4.5. Метод IsUpper() . Визначення, чи знаходиться символ у верхньому регістрі

Метод IsUpper() призначений для визначення, чи знаходиться символ у верхньому регістрі, у цьому випадку метод повертає true . Метод має дві перевантажені реалізації

bool char.IsUpper(char c); bool char.IsUpper(string s, int index);
  • c – символ, що перевіряється;
  • s – рядок, в якому перевіряється символ в позиції index . Символ, що перевіряється, має значення s[index] .
// Визначити, чи знаходиться символ у верхньому регістрі bool fRes; fRes = char.IsUpper('Ю'); // fRes = true, кириличні символи також обробляються fRes = char.IsUpper('ю'); // fRes = false fRes = char.IsUpper("abc+DEF", 4); // fRes = true
4.6. Метод IsNumber() . Визначення, чи символ є числом

Метод IsNumber() визначає, чи є символ числом. Якщо символ є числом, метод повертає true . Метод має дві перевантажені реалізації:

bool char.IsNumber(char c); bool char.IsNumber(string s, int index);
  • c – символ, що перевіряється;
  • s – рядок, в якому знаходиться символ, що перевіряється. Позиція символу задається параметром index .
// Визначити, чи є символ числом bool fRes; fRes = char.IsNumber('8'); // fRes = true fRes = char.IsNumber('\t'); // fRes = false fRes = char.IsNumber("2+2=5", 2); // fRes = true fRes = char.IsNumber("2+2=4", 3); // fRes = false
4.7. Метод IsSeparator() . Визначає, чи символ є розділювачем

Метод IsSeparator() використовується для визначення того, чи символ відноситься до категорії розділювачів згідно з кодуванням Unicode. Якщо символ є розділювачем, то метод повертає true .

Метод має дві перевантажені реалізації:

bool char.IsSeparator(char c); bool char.IsSeparator(string s, int index);
  • c – символ, що перевіряється;
  • s – рядок, в якому в позиції index отримується символ, який потрібно перевірити.
// Визначити, чи символ є розділювачем fRes = char.IsSeparator(' '); // fRes = true fRes = char.IsSeparator(','); // fRes = false fRes = char.IsSeparator('\n'); // fRes = false fRes = char.IsSeparator('\t'); // fRes = false
4.8. Метод IsWhiteSpace() . Визначає, чи символ є пробілом

Метод IsWhiteSpace() визначає, чи символ відноситься до категорії пробільних символів згідно з кодуванням Unicode. До пробільних символів можна віднести пробіл, символ табуляції, символ нового рядка тощо. У випадку успіху метод повертає true .

Існує дві реалізації методу:

bool char.IsWhiteSpase(char c); bool char.IsWhiteSpase(string s, int index);
  • c – символ, що перевіряється;
  • s – рядок, в якому в позиції index визначається символ, що перевіряється. Значення символу визначається як s[index] .
// Визначити, чи символ є пробілом bool fRes; fRes = char.IsWhiteSpace('\t'); // fRes = true fRes = char.IsWhiteSpace('\n'); // fRes = true fRes = char.IsWhiteSpace(' '); // fRes = true fRes = char.IsWhiteSpace('\b'); // fRes = false fRes = char.IsWhiteSpace(';'); // fRes = false
4.9. Метод ToLower() . Переводить символ в нижній регістр

Метод ToLower() використовується для переводу символу в нижній регістр (якщо можливо). Метод повертає перетворений символ. Згідно з документацією .NET Framework метод має дві перевантажені реалізації

char char.ToLower(char c); char char.ToLower(char c, System.Globalization.CultureInfo culture);
  • c – символ, що переводиться в нижній регістр;
  • culture – інформація про культуру, яка розміщується в класі System.Globalization.Culture . Культура описує імена для культури, систему запису, використовуваний календар, порядок сортування а також форматування для рядків та дат.
// Перевід символу в нижній регістр char c1, c2; c2 = 'A'; c1 = char.ToLower(c2); // c1 = 'a' c1 = char.ToLower(c2, CultureInfo.CurrentCulture); // c1 = 'a' c1 = char.ToLower(c2, CultureInfo.InvariantCulture); // c1 = 'a' c1 = char.ToLower('+'); // c1 = '+'
4.10. Метод ToUpper() . Переводить символ в верхній регістр

Метод ToUpper() призначений для переводу заданого символу в верхній регістр (якщо можливо). Якщо перетворення можливе (символ має представлення у двох регістрах), метод повертає символ у верхньому регістрі. Якщо неможливо виконати перетворення, то повертається значення вихідного символу. Згідно з документацією .NET Framework метод має дві перевантажені реалізації:

char char.ToUpper(char c); char char.ToUpper(char c,
  • c – символ, що переводиться в нижній регістр;
  • culture – інформація про культуру, яка розміщується в класі System.Globalization.Culture . Культура описує імена для культури, систему запису, використовуваний календар, порядок сортування а також форматування для рядків та дат.
// Перевід символу в верхній регістр char c1, c2; c2 = 'k'; c1 = char.ToUpper(c2); // c1 = 'K' c1 = char.ToUpper('f'); // c1 = 'F' c1 = char.ToUpper('='); // c1 = '='
5. Константи MinValue , MaxValue

У структурі System.Char введено дві константи:

  • MinValue – представляє мінімально допустиме значення типу char , яке рівне ‘\0’ ;
  • MaxValue – представляє максимально допустиме значення типу char , яке рівне ‘\uffff’ .

Звертання до кожної константи у програмі може бути таким

char.MinValue char.MaxValue

Зв’язані теми