- •Операции преобразования типов
- •Ввод данных
- •3. Отрицание:
- •9. Условная операция.
- •Одномерные массивы
- •Многомерные массивы
- •Неизменяемые строки string
- •Ступенчатые массивы
- •Символы и строки
- •Символы char
- •Изменяемые строки
- •Перегрузка методов
- •Работа с каталогами Абстрактный класс FileSystemInfo
- •Класс DirectoryInfo
- •Класс Directory
- •Работа с файлами Класс Filelnfo
- •Класс File
- •Оператор try
- •Операторы checked и unchecked
- •Генерация собственных исключений
- •Байтовый поток
- •Символьный поток
- •Двоичные потоки
- •Данные: поля и константы
- •Наследование
- •Наследование конструкторов
- •1) Позволяет вызвать конструктор базового класса:
- •2) Позволяет получить доступ к члену базового класса, который скрыт "за" членом производного класса.
- •Конструкторы
- •Конструкторы экземпляра
- •Конструкторы класса
- •Унарные операции
- •Бинарные операции
- •Виртуальные методы
Конструкторы
Конструктор предназначен для инициализации объекта. Конструкторы делятся на конструкторы класса (для статических классов) и конструкторы экземпляра класса (всех остальных классов).
Конструкторы экземпляра
Конструктор экземпляра вызывается автоматически при создании объекта класса с помощью операции new. Имя конструктора совпадает с именем класса. Рассмотрим основные свойства конструкторов:
Конструктор не возвращает значение, даже типа void.
Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.
Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов — значение null.
Если же при создании объектов требуется присваивать полю разные значения, это следует делать с помощью явного задания конструктора.
Конструкторы класса
Статические классы содержат только статические члены, в том числе и контруктор, которые храняться в памяти в единственном экземпляре. Поэтому создавать экземпляры класса нет смысла.
Чтобы подчеркнуть этот факт, в первой версии С# для статических классов создавали два конструктора, один - пустой закрытый (private) конструктор, второй - статический конструктор, не имеющий параметров. Первый конструктор предотвращал попытки создания экземпляров класса. Второй конструктор автоматически вызывается системой до первого обращения к любому элементу статического класса, выполняя необходимые действия по инициализации. Вышесказанное отражено в следующем примере:
class Demo
{
static int a;
static int b;
private Demo(){} //закрытый конструктор
static Demo() //статический конструктор
{
a=10;
b=2;
}
public static void Print ()
{
Console.WriteLine("{0}+{1}={2}",a,b,a+b);
Console.WriteLine("{0}*{1}={2}",a,b,a*b);
Console.WriteLine("{0}-{1}={2}",a,b,a-b);
}
}
class Program
{
static void Main()
{
//Demo S=new Demo(); //ошибка содать экземпляр класса нельзя
Demo.Print();
}
}
В версию 2.0 введена возможность описывать статический класс, то есть класс с модификатором static. Экземпляры такого класса создавать запрещено, и кроме того, от него запрещено наследовать. Все элементы такого класса должны явным образом объявляться с модификатором static (константы и вложенные типы классифицируются как статические элементы автоматически). Конструктор экземпляра для статического класса задавать запрещается.
static class Demo
{
static int a=20;
static int b=10;
public static void Print ()
{
Console.WriteLine("{0}+{1}={2}",a,b,a+b);
Console.WriteLine("{0}*{1}={2}",a,b,a*b);
Console.WriteLine("{0}-{1}={2}",a,b,a-b);
}
}
class Program
{
static void Main()
{
Demo.Print();
}
}
Деструкторы
В С# существует специальный вид метода, называемый деструктором, который вызывается сборщиком мусора непосредственно перед удалением объекта из памяти.
В деструкторе описываются действия, гарантирующие корректность последующего удаления объекта. Например, проверяется все ли ресурсы, используемые объектом, освобождены (файлы закрыты, удаленное соединение разорвано и т. п.).
Синтаксис деструктора:
[атрибуты] [extern] ~имя_класса()
{тело_деструктора}
Деструктор не имеет параметров, не возвращает значения и не требует указания спецификаторов доступа. Его имя совпадает с именем класса и предваряется тильдой (~), символизирующей обратные по отношению к конструктору действия. Тело деструктора представляет собой блок или просто точку с запятой. Если деструктор определен как внешний, то используется спецификатор extern.
В общем случае применение деструкторов замедляет процесс сборки мусора. Поэтому создавать деструкторы следует только тогда, когда необходимо освободить какие-то ресурсы перед удалением объекта.
Билет №22. Операции классов
Операции класса
С# позволяет переопределить большинство операций так, чтобы при использовании их объектами конкретного класса выполнялись действия, отличные от стандартных. Это дает возможность применять объекты собственных типов данных в составе выражений, например:
newObject x, y, z;
…
z = x+y; // используется операция сложения, переопределенная для класса newObject
Определение собственных операций класса называют перегрузкой операций. Перегрузка операций обычно применяется для классов, для которых семантика операций делает программу более понятной. Если назначение операции интуитивно непонятно, перегружать такую операцию не рекомендуется.
Операции класса описываются с помощью методов специального вида, синтаксис которых выглядит следующим образом:
[ атрибуты] спецификаторы объявитель_операции
{тело}
При описании операций необходимо соблюдать следующие правила:
операция должна быть описана как открытый статический метод класса (public static);
параметры в операцию должны передаваться по значению (то есть недопустимо использовать параметры ref и out);
сигнатуры всех операций класса должны различаться;
типы, используемые в операции, должны иметь не меньшие права доступа, чем сама операция (то есть должны быть доступны при использовании операции).
