1.5 Операторы;
Действия программы выражаются с помощью операторов. В C# поддерживается несколько различных типов операторов, некоторые из которых определяются как внедренные операторы.
Блок позволяет записывать несколько операторов в контекстах, в которых допускается только один оператор. Блок состоит из нескольких операторов, записанных между разделителями — { и }.
Операторы объявления используются для объявления локальных переменных и констант.
Операторы выражений используются для вычисления выражений. Как операторы могут использоваться следующие выражения: вызовы методов, выделение объектов с помощью оператора new, операторы присваивания «=» и составного присваивания, операции приращения и уменьшения с помощью операторов «++» и «--».
Операторы выбора используются для выполнения одного из нескольких возможных операторов на основании значения какого-либо выражения. В этой группе представлены операторы if и switch.
Операторы итераций используются для повторяющегося выполнения внедренного оператора. В этой группе представлены операторы while, do, for и foreach.
Операторы перехода используются для передачи управления. В этой группе представлены операторы break, continue, goto, throw, return и yield.
Оператор try...catch используется для перехвата исключений, происходящих во время выполнения блока. Оператор try...finally используется для задания кода финализации, который выполняется всегда (независимо от того, возникло или нет исключение).
Операторы checked и unchecked используются для управления контекстом проверки переполнения при выполнении целочисленных математических операций и преобразований.
Оператор lock используется для получения блокировки взаимного исключения для заданного объекта, выполнения оператора и последующего снятия блокировки.
Оператор using используется для получения ресурса, выполнения оператора и последующего удаления ресурса.
В следующей таблице представлены операторы C# и примеры их использования.
Оператор
| Пример
|
Объявление локальной переменной
| static void Main() { int a; int b = 2, c = 3; a = 1; Console.WriteLine(a + b + c); }
|
Объявление локальной константы
| static void Main() { const float pi = 3.1415927f; const int r = 25; Console.WriteLine(pi * r * r); }
|
Оператор выражения
| static void Main() { int i; i = 123; // Оператор выражения Console.WriteLine(i); // Оператор выражения i++; // Оператор выражения Console.WriteLine(i); // Оператор выражения }
|
Оператор if
| static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Нет аргументов"); } else { Console.WriteLine("Один или более аргументов"); } }
|
Оператор switch
| static void Main(string[] args) { int n = args.Length; switch (n) { case 0: Console.WriteLine("Нет аргументов"); break; case 1: Console.WriteLine("Один аргумент"); break; default: Console.WriteLine("Аргументов: {0}", n); break; } } }
|
Оператор while
| static void Main(string[] args) { int i = 0; while (i < args.Length) { Console.WriteLine(args[i]); i++; } }
|
Оператор do
| static void Main() { string s; do { s = Console.ReadLine(); if (s!= null) Console.WriteLine(s); } while (s!= null); }
|
Оператор for
| static void Main(string[] args) { for (int i = 0; i < args.Length; i++) { Console.WriteLine(args[i]); } }
|
Оператор foreach
| static void Main(string[] args) { foreach (string s in args) { Console.WriteLine(s); } }
|
Оператор break
| static void Main() { while (true) { string s = Console.ReadLine(); if (s == null) break; Console.WriteLine(s); } }
|
Оператор continue
| static void Main(string[] args) { for (int i = 0; i < args.Length; i++) { if (args[i].StartsWith("/")) continue; Console.WriteLine(args[i]); } }
|
Оператор goto
| static void Main(string[] args) { int i = 0; goto check; loop: Console.WriteLine(args[i++]); check: if (i < args.Length) goto loop; }
|
Оператор return
| static int Add(int a, int b) { return a + b; }
static void Main() { Console.WriteLine(Add(1, 2)); return; }
|
Оператор yield
| static IEnumerable<int> Range(int from, int to) { for (int i = from; i < to; i++) { yield return i; } yield break; }
static void Main() { foreach (int x in Range(-10,10)) { Console.WriteLine(x); } }
|
Операторы throw и try
| static double Divide(double x, double y) { if (y == 0) throw new DivideByZeroException(); return x / y; }
static void Main(string[] args) { try { if (args.Length!= 2) { throw new Exception("Введите два числа"); } double x = double.Parse(args[0]); double y = double.Parse(args[1]); Console.WriteLine(Divide(x, y)); } catch (Exception e) { Console.WriteLine(e.Message); } finally { Console.WriteLine("Окончание работы"); } }
|
Операторы checked и unchecked
| static void Main() { int i = int.MaxValue; checked { Console.WriteLine(i + 1); // Исключение } unchecked { Console.WriteLine(i + 1); // Переполнение } }
|
Оператор lock
| class Account { decimal balance;
public void Withdraw(decimal amount) { lock (this) { if (amount > balance) { throw new Exception("Недостаточно средств"); } balance -= amount; } } }
|
Оператор using
| static void Main() { using (TextWriter w = File.CreateText("test.txt")) { w.WriteLine("Строка 1"); w.WriteLine("Строка 2"); w.WriteLine("Строка 3"); } }
|
1.6 Классы и объекты;
В C# классы представляют собой фундаментальные типы. Класс — это структура данных, объединяющая состояние (поля) и действия (методы и другие функции-члены). Класс предоставляет определения для динамически создаваемых экземпляров класса (также называются объектами). Классы поддерживают механизмы наследования и полиморфизма, которые позволяют создавать производные классы, расширяющие функциональные возможности базового класса.
Новые классы создаются с помощью объявлений класса. Объявление класса начинается с заголовка, в котором задаются атрибуты и модификаторы класса, имя класса, базовый класс (если есть), а также интерфейсы, реализуемые классом. За заголовком следует тело класса, которое содержит перечень объявлений членов, записанных между разделителями — { и }.
Ниже приведено объявление простого класса Point:
public class Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Экземпляры класса создаются с помощью оператора new, который выделяет память для нового экземпляра, вызывает конструктор для инициализации экземпляра и возвращает ссылку на экземпляр. С помощью следующих операторов создаются два объекта Point, ссылки на которые сохраняются в двух переменных:
Point p1 = new Point(0, 0);
Point p2 = new Point(10, 20);
Память, занимаемая объектом, автоматически освобождается, если объект более не используется. В C# не обязательно (и не допускается) явно освобождать память от объектов.
1.6.1 Члены;
Класс может содержать статические члены или члены экземпляра. Статические члены принадлежат классам. Члены экземпляра принадлежат объектам (экземплярам класса).
В следующей таблице представлен обзор видов членов, которые может содержать класс.
Член
| Описание
|
Константы
| Постоянные значения, связанные с классом
|
Поля
| Переменные класса
|
Методы
| Вычисления и действия, которые могут выполняться классом
|
Свойства
| Действия, связанные с чтением и записью именованных свойств класса
|
Индексаторы
| Действия, связанные с индексацией экземпляров класса, например массива
|
События
| Уведомления, которые могут формироваться классом
|
Операторы
| Операторы преобразования и выражений, поддерживаемые классом
|
Конструкторы
| Действия, необходимые для инициализации экземпляров класса или самого класса
|
Деструкторы
| Действия, выполняемые перед окончательным удалением экземпляров класса
|
Типы
| Вложенные типы, объявленные в классе
|