- •1 Основные сведения о C#
- •1.1 Особенности языка
- •1.2 Типы данных
- •1.3 Переменные
- •1.4 Константы (литералы)
- •1.5 Операторы, используемые при построении выражений
- •1.6 Класс Object
- •1.7 Класс Math
- •1.8 Класс Convert
- •1.9 Пространство имён
- •1.10 Типы, допускающие значение null
- •2 Операторы и конструкции С#
- •2.1 Операторы присваивания
- •2.2 Приведение типов
- •2.3 Операторы инкремента и декремента
- •2.4 Операторные скобки {}
- •2.5 Условный оператор if
- •2.6 Логические операторы «И» и «ИЛИ»
- •2.7 Условный оператор ? :
- •2.8 Оператор выбора switch и оператор прерывания break
- •2.9 Оператор цикла for
- •2.10 Оператор цикла while
- •2.11 Оператор цикла do...while
- •2.12 Операторы прерываний break (для циклов) и continue
- •2.13 Оператор new
- •2.14 Массивы
- •2.14.1 Одномерные массивы
- •2.14.2 Многомерные массивы
- •2.14.3 Ступенчатые массивы
- •2.14.4 Работа с массивами как с объектами
- •2.15 Оператор цикла foreach
- •2.16 Строки
- •2.17 Перечисления
- •2.18 Обработка исключений
- •2.18.1 Класс Exception и стандартные исключения
- •2.18.2 Блок try...catch
- •2.18.3 Блок try...finally
- •2.18.4 Блок try...catch...finally
- •2.18.5 Оператор throw
- •3 Классы. Основные понятия
- •3.1 Общая схема
- •3.2 Спецификаторы доступа
- •3.3 Поля
- •3.4 Создание объекта и доступ к его членам
- •3.5 Методы
- •3.5.1 Перегрузка методов
- •3.5.2 Новое в версии C# 4.0
- •3.6 Конструкторы
- •3.7 Деструкторы
- •3.8 Инициализаторы объектов
- •3.9 Свойства
- •3.10 Индексаторы
- •4 Классы. Расширенное использование
- •4.1 Статические классы и члены классов
- •4.2 Наследование
- •4.2.1 Наследование и конструкторы
- •4.2.2 Переопределение членов класса
- •4.3 Полиморфизм
- •4.3.1 Виртуальные методы
- •4.3.2 Абстрактные классы и члены классов
- •4.3.3 Операторы as и is
- •4.3.4 Модификатор sealed
- •4.4 Перегрузка операторов
- •5 Интерфейсы
- •6 Делегаты, лямбда-выражения и события
- •6.1 Делегаты
- •6.2 Анонимные методы и лямбда-выражения
- •6.3 События
- •7 Универсальные типы
- •7.1 Общая схема
- •7.2 Ограничения по параметрам типа
- •7.2.1 Ограничение на базовый класс
- •7.2.2 Ограничение на интерфейс
- •7.2.3 Ограничение на конструктор
- •7.2.4 Ограничения ссылочного типа и типа значения
- •7.3 Параметры типы в методах
- •7.4 Некоторые универсальные типы С#
- •7.4.1 Класс Array
- •7.4.2 Класс List<T>
- •7.4.3 Класс LinkedList<T>
- •7.4.4 Класс Queue<T>
- •7.4.5 Класс Stack<T>
- •7.4.6 Классы SortedSet<T> и HashSet<T>
- •7.4.7 Классы Dictionary<TKey, TValue> и SortedDictionary<TKey, TValue>
- •8 Работа с файлами
- •8.1 Класс File
- •8.2 Работа с файлами как с потоками
- •8.2.1 Класс FileStream
- •8.2.2 Класс StreamReader
- •8.2.3 Класс StreamWriter
- •8.2.4 Класс BinaryReader
- •8.2.5 Класс BinaryWriter
3.5.2 Новое в версии C# 4.0
Начиная с версии C# 4.0 параметрам метода, конструктора или индексатора могут быть заданы значения по умолчанию. Это позволяет делать параметры необязательными. Для указания значения по умолчанию необходимо при описании параметра присвоить ему значение, например:
public class MyClass
{
public int Method(int a = 1, int b = 1, int c = 1)
{
return a * b * c;
}
} |
|
|
|
MyClass cl = new MyClass(); |
|
|
|
int i1 |
= cl.Method(2, 3, 4); // i1 |
= 24 |
|
int i2 |
= cl.Method(5, 6); |
// i2 |
= 30 |
int i3 |
= cl.Method(7); |
// i3 |
= 7 |
int i4 |
= cl.Method(); |
// i4 |
= 1 |
Если в методе требуются обязательные и необязательные параметры, то в описании метода обязательные параметры должны указываться первыми, т.е. описание метода
public int Method(int a = 1, int b, int c = 1) {return a * b * c;}
будет недопустимым.
Введение для параметров значений по умолчанию может привести к сложностям при использовании перегрузки методов, например:
public class MyClass
{
public int Method(int a, int b = 1)
{
return a * b;
}
public double Method(int a, double b = 1.0)
{
return a * b;
}
} |
|
MyClass cl = new MyClass(); |
|
int i = cl.Method(2, 3); |
// i = 6 |
double d = cl.Method(2, 3.0); // d = 6.0 |
|
d = cl.Method(2); |
// Неоднозначность |
i = cl.Method(2); |
// Неоднозначность |
В строке d = cl.Method(2); возникает неоднозначность, т.к. компилятор не может определить, какой из перегруженных методов использовать. Изменение типа
54
возвращаемого значения для сужения диапазона возможных значений (i = cl.Method(2)) также не приведёт к устранению неоднозначности. В таких случаях, лучше не использовать значения по умолчанию в перегружаемых методах.
Ещё одним новшеством при работе с методами является возможность использовать имена параметров при вызове метода. Формат описания параметра при этом имеет вид:
<идентификатор параметра> : <значение>
Применение именованных параметров позволяет указывать их не в той последовательности, в которой они описаны в методе, например:
public class MyClass
{
public int Method(int a, int b)
{
return a - b;
}
} |
|
|
|
MyClass cl = new MyClass(); |
|
|
|
int i1 = cl.Method(5, 3); |
// i1 |
= 2 |
|
int i2 = cl.Method(a: 5, b: 3); // i2 |
= 2 |
||
int i3 |
= cl.Method(b: 5, a: 3); // i3 |
= -2 |
|
int i4 |
= cl.Method(5, b: 3); |
// i4 |
= 2 |
int i5 |
= cl.Method(5, a: 3); |
// Ошибка |
Строка (int i5 = cl.Method(5, a: 3)) недопустима, т.к. в ней выполняется повторное присваивание значения параметру «a».
Именованные параметры могут применяться в комбинации с значениями по умолчанию, что позволяет указывать при вызове метода только требуемые параметры, например:
public class MyClass
{
public double Method(double a = 1.0, double b = 1.0, double c = 1.0)
{
return (a - b) / c;
}
}
MyClass cl = new MyClass();
double d1 = cl.Method(a: 2); // d1 = 1 double d2 = cl.Method(b: 2); // d2 = -1 double d3 = cl.Method(c: 2); // d3 = 0
55