ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.08.2024
Просмотров: 1091
Скачиваний: 0
СОДЕРЖАНИЕ
Основы c#. Урок 1. Что такое c#?
Основы c#. Урок 2. Что такое net Runtime?
Основы c#. Урок 3. Первая программа на c#
Основы c#. Урок 4. Переменные языка c#
Основы c#. Урок 5. Логические операторы
Основы c#. Урок 6. Массивы в c#
Основы c#. Урок 7. Операторы if и switch
Основы c#. Урок 8. Циклы for и foreach
Основы c#. Урок 10. Классы в c#
Основы c#. Урок 11. Конструкторы классов
Основы c#. Урок 12. Наследование
Основы c#. Урок 13. Запись в экземпляр базового класса экземпляра производного
Основы c#. Урок 14. Вложенные классы
Основы c#. Урок 15. Перегрузка бинарных операторов
Основы c#. Урок 16. Перегрузка унарных операторов
Основы c#. Урок 17. Область видимости
Основы c#. Урок 18. Виртуальные функции
Основы c#. Урок 19. Абстрактные классы
Основы c#. Урок 20. Запрещение наследования или модификатор sealed
Основы c#. Урок 21. Статические переменные
Основы c#. Урок 22. Статические методы класса
Основы c#. Урок 23. Статические конструкторы
Основы c#. Урок 24. Закрытые конструкторы или классы без экземпляров
Основы c#. Урок 25. Передача параметров переменой длины
Основы c#. Урок 26. Строки (класс System.String)
Основы c#. Урок 27. Строки (класс StringBuilder)
Основы c#. Урок 28. Передача параметров по ссылке и по значению (ref и out)
Основы c#. Урок 29. Пример передачи по ссылке
Основы c#. Урок 30. Перегрузка
Основы c#. Урок 31. Функции класса System.Array
Основы c#. Урок 35. Введение в атрибуты
Основы c#. Урок 36. Пример пользовательского атрибута.
Основы c#. Урок 37. Параметры командной строки
Основы c#. Урок 38. Метод Main в отдельном классе
Основы c#. Урок 39. Форматированный вывод
Основы c#. Урок 40. Класс System.Object
Основы c#. Урок 41. Методы класса System.Object
Основы c#. Урок 42. Переопределяем методы класса System.Object
Основы c#. Урок 44. Модификаторы доступа
Основы c#. Урок 45. Ссылка на текущий экземпляр класса (this)
Основы c#. Урок 47. Работаем со специальными папками
Основы c#. Урок 48. Получаем список всех дисков
Основы c#. Урок 49. Ввод/вывод в c# (System.Io)
Основы c#. Урок 50. Классы для работы с папками и файлами
Основы c#. Урок 51. Класс Directory
Основы c# Урок 53. Класс FileSystemInfo
Основы c# Урок 54. Класс DirectoryInfo
Основы c# Урок 55. Перечисление FileAttributes
Давайте рассмотрим первый пример класса. Создайте новое консольное приложение для C# и введите следующий текст:
usingSystem;
namespacetest
{
//Начало класса
class Worker
{
public int age=0;
public string name;
}
//Конец класса
classTest
{
[STAThread]
static void Main(string[] args)
{
Worker wrk1 = new Worker();
wrk1.age=34;
wrk1.name="Иванов";
Console.WriteLine(wrk1.name+", "+wrk1.age);
}
}
}
Запустите программу. Она, как и следовало ожидать, выведет на экран "Иванов, 34".
Давайте кратко обсудим наш код. Во-первых, в строчках
...
class Worker
{
public int age=0;
public string name;
}...
мы оределили наш класс Worker. Внутри этого класса существует две переменные - целая age для возраста и name строкового типа для имени. Обратите внимание, что, в отличие от C/C++, мы можем задавать некоторое начальное значение прямо сразу после объявления переменной:
...
public int age=0;
...
Начальное значение задавать вовсе не обязательно - это видно по переменной name.
Перед переменными мы пишем ключевое слово public. Значение у него такое же, как и в C++ - а именно это означает, что эта переменная (или функция) будет видна вне класса. Если мы не напишем перед переменной никакого модификатора доступа, или напишем private, то пременая не будет видна снаружи класса и ее смогут использовать только фунции этого же класса (т. е. она будет для "внутреннего использования").
Далее в строчке
...
Worker wrk1 = new Worker();
...
мы заводим экземмпляр класса в куче (heap) и возвращаем на него ссылку.
Затем в строчках
...
wrk1.age=34;
wrk1.name="Иванов";
Console.WriteLine(wrk1.name+", "+wrk1.age);
...
мы используем наш класс. А именно присваиваем некоторые значения для возраста и имени и выводим их потом на экран.
С этим уроком все.
Основы c#. Урок 11. Конструкторы классов
Для начала кратко обсудим, что такое конструктор вообще. Конструктор - это функция (метод) класса. Раз эта функция, то описываем мы ее почти точно так же, как и любую другую функцию класса - пишем параметры в круглых скобках и т. п. Когда конструктор вызывается? В момент создания переменной. При этом у класса может быть несколько конструкторов - но при этом они должны различаться или типом параметров, или их количеством.
Этот урок будет основан на предыдущем. Откройте проект, созданный на прошлом уроке. Давайте добавим в наш класс Worker конструктор:
...
class Worker
{
public int age=3;
public string name;
//Конструктор 1
public Worker(int age, string name)
{
this.age=age;
this.name=name;
}
}
...
Обратите внимание на ряд особенностей конструктора. Во-первых, конструктор называется как класс. Раз наш класс называется Worker, значит и конструктор должен называться точно также. И во-вторых, конструктор, в отличие от других методов класса, не возвращает никакого значения (даже типа void). Если вы знакомы с языком C++, то, несомненно, это вам все знакомо.
Что делает наш конструктор? Он записывает передаваемые в него параметры во внутренние переменные класса. Обратите внимание, что называются они одинаково - age и age, name и name. Компилятор сначала ищет локальную переменную с таким именем, и, если не находит, то переменную класса. Поэтому age (и name) - это передаваемый в конструктор параметр. Если же нам надо сослаться на переменную класса (при существавании переменной с таким же именем, как и передаваемый в функцию параметр), то мы используем ключевое слово this. Оно всегда указывает на текущий экземпляр нашего класса. Таким образом в строчках
...
this.age=age;
this.name=name;
...
мы передаем параметры конструктора в переменые класса.
Теперь изменим тестовый класс test следующим образом:
...
static void Main(string[] args)
{
//Вызываем конструктор
Worker wrk1 = new Worker(40, "Вася");
Console.WriteLine(wrk1.name+", "+wrk1.age);
}
...
Теперь после объявления переменной мы вызываем конструктор с двумя параметрами, который запишет в переменные age и name экземпляра класса Worker значания 40 и "Вася". Строчкой ниже эти значения выводятся на экран.
Основы c#. Урок 12. Наследование
Представьте себе, что у нас есть некоторый класс (быть может весьма большой), который почти подходит для нашей конкретной задачи. Почти, но не совсем. Что-то (некоторые методы) в этом классе надо изменить, что-то - добавить. Наследование как раз и служит для этого. При наследовании мы объявляем наш класс потомком другого класса. И наш класс-потомок (или, как его еще называют, дочерний класс) автоматически приобретает всё, что было в родительском классе. Это мы делаем буквально парой строчек. Затем в дочерний класс мы можем что-нибудь добавить (чего не было в классе родительском). Кроме того, в дочернем классе мы можем что-нибудь из родительского класса переопределить - так что оно уже будет работать по-другому.
Давайте рассмотрим это все на примере. У нас будет класс Worker и производный от него класс Boss. Класс Boss будет отличаться от класса Worker во-первых, наличием переменной numOfWorkers (для количества подчиненных) и, во вторых, метод для задания возраста (setAge) будет работать в Boss не так:
usingSystem;
namespacetest
{
//Класс Worker
class Worker
{
protected int age=0;
public void setAge(int age)
{
if(age>0 && age<100)
this.age=age;
else
this.age=0;
}
public int getAge()
{
return age;
}
}
//Класс Boss
class Boss : Worker{
publicintnumOfWorkers;//Количество подчиненных
public new void setAge(int age)
{
if(age>0 && age<45)
this.age=age;
else
this.age=0;
}
}
class Test
{
static void Main(string[] args)
{
Worker wrk1 = new Worker();
Boss boss = new Boss();
wrk1.setAge(50);
boss.setAge(50);
boss.numOfWorkers=4;
Console.WriteLine("Возраст работника "+wrk1.getAge());
Console.WriteLine("Возраст босса "+boss.getAge()+
".\nКоличество подчиненных "+boss.numOfWorkers);
}
}
}
Обратите внимание, как мы вводим новый класс Boss:
...
class Boss : Worker{
...
Такая запись и означает, что новый класс Boss будет потомком другого класса (Worker в данном случае). Так как наш класс - потомок другого класса, то он автоматически умеет все тоже самое, что и родительский класс. В частности, в нем есть переменная age для хранения возраста. Далее, в класс Boss мы вводим переменную numOfWorkers для хранения количество подчиненных у нашего босса. В родительском классе такой переменной не было. Кроме того, нас не устроила реализация метода setAge из родительского класса Worker (по каким-то там внутренним инструкциям фирмы возраст босса не может превышать 45 лет, тогда как возраст работника не может превышать 100), поэтому мы просто написали в классе Boss метод с таким же именем. Обратите внимание на слово new при объявлении метода:
...
public new void setAge(int age)
...
Таким образом мы в производном классе можем что-нибудь добавлять и что-нибудь изменять по отношению к классу родительскому. Обратите внимание, что убирать что-нибудь, полученное в наследство от родительского класса, мы не можем.
При запуске наша программа даст вполне ожидаемый результат - в возраст работника запишется 50, в возраст босса - 0.
Основы c#. Урок 13. Запись в экземпляр базового класса экземпляра производного
В переменной типа базового класса можно хранить и переменные производных класов. Например, текст метода Main из класса Test прошлого урока можно переписать следующим образом:
...
static void Main(string[] args)
{
Worker wrk1 = new Boss();
...
Здесь мы объявили переменную wrk1 типа Worker. Вот другой пример на эту же тему:
Worker wrk1;
Boss boss = new Boss();
wrk1=boss;
...
Здесь мы опять записываем в переменную wrk1 (типа Worker) переменную boss (типа Boss).
Но, несмотря на то, что мы записываем в переменную wrk1 или с помощью оператора new или посредством присваивания экземпляр производного класса, все равно методы производного класса мы использовать не можем (на самом деле из производного класса мы не сможем использовать не только методы, но и переменные)!
Например, в следущие строки выведут на экран 50, а не ноль:
wrk1.setAge(50); //Вызывается метод класса Worker, а не класса Boss
Console.WriteLine("Возраст работника " + wrk1.getAge());
Как с этим бороться, мы рассмотрим на следующем уроке, а пока поясним, почему это может оказаться важным. Например, в вашей фирме есть работники разных типов - программисты, директора, бухгалтера и т. п. Так как у все категорий работников есть что-общее, что вы можете создать базовый класс Worker и производные от него специализированные классы. Далее вы можете в вашей программе объявить массив типа Worker. Так вот, в этом массиве можно будет хранить всех работников (т. е. экземпляры всех классов, производных от класса Worker). И это удобно - одним циклом вы сможете начислить всем зарплату и т. п.
Основы c#. Урок 14. Вложенные классы
Иногда для некоторый класс играет чисто вспомогательную роль для другого класса и используется только внутри него. В этом случае логично описать его внутри существующего класса. Вот пример такого описания:
usingSystem;
namespacetest
{
classClassA
{
//Вложенный класс
private class ClassB
{
public int z;
}
//Переменная типа вложенного класса
private ClassB w;
//Конструктор
public ClassA()