Основы ООП и C# Работа с объектами и классами
Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение класса выглядит так: [модификаторы] class имя_класса [: имя_родителя] [: список интерфейсов] { … //Список состава класса – поля, методы, свойства, события } Модификатором может быть, например, уровень доступа или static. Уровень доступа определяет возможность создания экземпляров класса в разных частях программы. Например, public полный доступ без ограничений; private доступен только из кода в том же классе; protected доступен только из кода в том же классе, либо в производном классе; internal доступен из любого кода в той же сборке, но не из другой сборки. Например, class Point { public double X; public double Y; }
Создание объекта Объект (экземпляр класса) создается c помощью ключевого слова new : имя_объекта = new имя_класса(); Например: Point vertex = new Point(); Можно сразу задать значения полей классов при создании объекта: Point vertex = new Point(X = 1, Y = 3); Объект (экземпляр класса) переменная ссылочного типа. Он хранится в куче вместе со значениями своих полей. Обращение к динамическим полям класса осуществляется через операцию "точка", применяемую к имени объекта. Например: vertex.X = –1; vertex.Y = 0; Объект удаляется автоматически сборщиком мусора.
Методы класса Методы класса это методы, определенные в классе. Методы задают поведение объекта и взаимодействие с ним. Методы бывают статические и динамические. Статические методы имеют модификатор static. Вызов динамического метода происходит при обращении к нему через имя объекта: имя_объекта.имя_метода([список_аргументов]) Например, myParaghraph.Delete() //удаление абзаца Статические методы вызываются через имя класса: Console.WriteLine("Hello, World!"); Методы класса задаются внутри описания класса как обычные методы. Для того, чтобы имелась возможность обратится к методу класса извне, он должен иметь уровень доступа public.
Работа с файлами Для работы с файлами.NET предоставляет классы File и FileInfo. Класс File статический, создать экземпляр класса невозможно. Обращение к методам класса осуществляется через имя класса [System.IO.] File.имя_метода Основные методы: Copy(имя 1_файла, имя 2_файла) копирует файл имя 1_файла в файл имя 2_файла. Create File(имя_файла) создает файл с заданным именем. Возвращает объект типа FileInfo. Delete(имя_файла) удаляет файл. Exists(имя_файла) возвращает True, если указанный файл существует, и False, если нет. GetAttributes(имя_файла) возвращает значение типа FileAttributes с атрибутами файла. Move(имя 1_файла, имя 2_файла) перемещает файл. SetAttributes(имя_файла, атрибуты_файла) задает атрибуты файла. Еще несколько важных методов, связанных с чтением и записью рассмотрим позже. Класс FileInfo инкапсулирует конкретные файлы, поэтому для его использования следует предварительно создавать экземпляры класса: var myFile = new FileInfo("test.txt");
Файлы: чтение и запись Запись в файл текста: метод WriteAllText для записи текста в файл, нужно указать файл и текст, который требуется записать; метод WriteAllLines записывает массив или коллекцию строк в файл; для добавления текста в файл используются AppendAllText или AppendAllLines. Запись двоичных данных: метод WriteAllBytes, нужно указать путь к файлу и имя файла и байты, которые требуется записать. для добавления двоичных данных в файл используется AppendAllBytes. Чтение текста из файла : метод ReadAllText для чтения текста из файла, нужно указать файл, возвращаемый объект строка; метод Read AllLines читает файл построчно, нужно указать файл, возвращаемый объект массив строк; Запись двоичных данных: метод ReadAllBytes, нужно указать путь к файлу и имя файла, возвращает массив байтов ( byte[] ). Для чтения или записи файлов в потоке используются специальные объекты классов StreamReader или StreamWriter.
Работа с папками (каталогами) Для работы.NET предоставляет классы Directory и DirectoryInfo. Класс Directory статический, создать экземпляр класса невозможно. Обращение к методам класса осуществляется через имя класса [ System.IO.]Directory.имя_метода Основные методы: CreateDirectory(имя_папки) создает папку с заданным именем. Возвращает объект типа DirectoryInfo. Delete(имя_папки[, флаг]) удаляет папку (пустую без второго параметра, непустую с флагом True ). Exists(имя_папки) возвращает True, если указанная папка существует, и False, если нет. Move(имя 1_папки, имя 2_папки) перемещает папку со всем содержимым. SetCurrentDirectory (имя_папки) задает в качестве текущей указанную папку. Класс DirectoryInfo инкапсулирует конкретные папки, поэтому для его использования следует предварительно создавать экземпляры класса: var myDir = new DirectoryInfo("c:\temp"); Для обращения к текущему каталогу можно использовать символ точка "." var myDir = new DirectoryInfo("."); или получить имя методом Directory.GetCurrentDirectory()
Свойства Свойство реализуют механизм доступа для чтения или изменения частного (private) поля. По сути свойство это пара методов get и set для получения значения и установки значения соответственно. Синтаксически доступ к свойству осуществляется также, как и к публичному полю класса. Обращение к свойству: имя_объекта.имя_свойства Напимер, myObject.BackColor Задание свойства класса private тип_свойства имя_переменной_значения; [Уровень_доступа] тип_свойства имя_свойства { get { … //код для получения значения свойства } set { … //код для установки значения свойства } }
Свойства (продолжение) Ключевое слово value используется для определения значения, присваиваемого методом set. private int count; public int Count { get { return count;} set { count = value;} } Методы get и set могут иметь различный уровень доступа. Например, если метод set имеет модификатор private, то к нему можно будет обращаться только из самого класса, а не извне. Свойство, не реализующее метод set, доступно только для чтения. Если нет необходимости в каких-либо специальных действиях при получении или установке значения свойства, то можно использовать сокращенную запись и явно не декларировать соответствующее частное поле (оно будет создано автоматически): [Уровень_доступа] тип_свойства имя_свойства {get; set;} public int Count {get; set;}
Конструкторы класса Конструктор класса метод, инициализирующий значения полей при создании экземпляра класса (объекта). Если в классе не определен конструктор, C# автоматически генерирует для него конструктор, вызываемый без аргументов. Работа этого конструктора сводится к инициализации всех полей экземпляра значениями по умолчанию. Такой конструктор называется конструктором по умолчанию. Создание объекта с инициализацией полей/свойств. Объект создается конструктором по умолчанию, затем выполняются операторы присваивания, устанавливающие значения полей/свойств. имя_объекта = new имя_класса {имя_п 1 = знач_п 1[, [.имя_п 2 = знач_п 2…] } Если в классе определен хотя бы один пользовательский конструктор, C# не станет генерировать конструктор по умолчанию. Создание пользовательского конструктора: public имя_класса([список аргументов]) { … //код инициализации полей класса } Возможно создание нескольких конструкторов, но они должны отличаться сигнатурой, т.е. количеством и типами аргументов. Конструктор может вызывать другой конструктор через " : this".
Статический конструктор Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое требуется выполнить только один раз для «настройки» класса перед его использованием. Он вызывается автоматически перед созданием первого экземпляра или перед первым обращением к любому статистическому члену. Статический конструктор не должен иметь модификаторов доступа и параметров. static Имя_класса() { … // настройка класса } Например, в классе User есть статическое поле LogFileName только для чтения. Его инициализация возможна только в статическом конструкторе: static User() { LogFileName = "log.txt"; }
Деструктор класса Деструктор это метод, который вызывается в момент перед уничтожением экземпляра класса. Деструктор класса следует определять в случае необходимости обязательно совершить какие-то действия перед уничтожением объекта. Программа не может управлять моментом вызова деструктора, потому что момент вызова определяется сборщиком мусора, который вызывает деструктор (при наличии) и освобождает память, используемую для хранения уничтожаемого объекта. Деструкторы также вызываются при выходе из программы. Деструктор класса может быть только один и не должен иметь аргументов. Деструктор должен иметь следующий синтаксис: ~имя_класса() //заголовок { … //код, выполняемый перед уничтожением объекта } Например, class User { … //Деструктор класса User ~User() { … //код, например запись в журнал (log) } … }