ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.08.2024

Просмотров: 1122

Скачиваний: 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#. Урок 9. Цикл while

Основы 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#. Урок 33. События

Основы c#. Урок 35. Введение в атрибуты

Основы c#. Урок 36. Пример пользовательского атрибута.

Основы c#. Урок 37. Параметры командной строки

Основы c#. Урок 38. Метод Main в отдельном классе

Основы c#. Урок 39. Форматированный вывод

Основы c#. Урок 40. Класс System.Object

Основы c#. Урок 41. Методы класса System.Object

Основы c#. Урок 42. Переопределяем методы класса System.Object

Основы c#. Урок 43. Константы

Основы c#. Урок 44. Модификаторы доступа

Основы c#. Урок 45. Ссылка на текущий экземпляр класса (this)

Основы c#. Урок 47. Работаем со специальными папками

Основы c#. Урок 48. Получаем список всех дисков

Основы c#. Урок 49. Ввод/вывод в c# (System.Io)

Основы c#. Урок 50. Классы для работы с папками и файлами

Основы c#. Урок 51. Класс Directory

Основы c# Урок 52. Класс File

Основы c# Урок 53. Класс FileSystemInfo

Основы c# Урок 54. Класс DirectoryInfo

Основы c# Урок 55. Перечисление FileAttributes

Основы c# Урок 56. Класс FileInfo

Основы c# Урок 57. Пример: получение имен всех подпапок

{

w=new ClassB();

w.z=35;

}

//Некоторый метод

public int SomeMethod()

{

return w.z;

}

}

class Test

{

static void Main(string[] args)

{

ClassA v=new ClassA();

int k=v.SomeMethod();

Console.WriteLine(k);

}

}

}

Здесь класс ClassB объявлен внутри класса ClassA. Объявлен он со словом private, так что его экземпляры мы можем создавать только внутри класса ClassA (что мы и делаем в конструкторе класса ClassA). Методы класса ClassA имеют доступ к экземпляру класса ClassB (как, например, метод SomeMethod).

Вложенный класс имеет смысл использовать тогда, когда его экземпляр используется только в определенном классе. Кроме того, при использовании вложеных классов улучшается читаемость кода - если нас не интересует устройство основного класса, то разбирать работу вложенного класса нет необходимости.

Обратите также внимание, как вложенные классы показываются на вкладке ClassView:


Основы c#. Урок 15. Перегрузка бинарных операторов

Перегрузка операторов - это задание для известных операторов (например, для +) новых значений. Например, мы можем перегрузить оператор + для векторов так, чтобы стало возможным использование в нашей программе конструкции вида:

...

Vector a, b, c;

...

c = a + b;

...

Здесь Vector - это введеный нами класс. Если мы не сделаем перегрузку операторов, то мы не сможем использовать знак "плюс" для экземпляров нашего класса Vector. Вот как это можно сделать для бинарного (т. е. имеющего два параметра) оператора:

usingSystem;

namespacetest

{

class Vector

{

float x, y; //Координаты

//Конструктор

public Vector(float x, float y)

{

this.x=x;

this.y=y;

}

//Чтение x-координаты

public float GetX()

{

return x;

}

//Чтение y-координаты

public float GetY()

{

return y;

}

//Перегрузка оператора +

public static Vector operator +(Vector w, Vector v)

{

Vector res = new Vector(w.x + v.x, w.y + v.y);

return res;

}

}

class Test

{

static void Main(string[] args)

{

Vector a=new Vector(1, 2), b=new Vector(2, -1), c;

c = a + b;

Console.WriteLine("x=" + c.GetX() + ", "

+ "y=" + c.GetY());

}

}

}

Код для нашего класса приведен полностью, хотя перегрузка оператора занимает всего несколько строк. Вот они:

...

public static Vector operator +(Vector w, Vector v)

{

Vector res = new Vector(w.x + v.x, w.y + v.y);

returnres;

}

...

Синтаксис здесь такой - если мы перегружаем оператор op, то мы должны в качестве имени оператора написать operator op (в нашем случае мы перегружаем +, поэтому пишем operator +). Далее, раз это метод, то мы пишем в круглых скобках его параметры. Для бинарного оператора их два (в отдичие от C++, где пареметр - это только правый операнд, левый же передается неявно - через указатель this). У нас они оба имеют тип Vector. Перед operator op пишем тип возвращаемого значения. Так как сумма двух векторов - это опять вектор, то перед именем нашего метода пишем Vector. Модификатор доступа public понятен - без него мы бы не смогли использовать перегруженный оператор вне класса. А вот слово staticважно - в C# перегруженные операторы идут как static. Не забывайте его писать.


Внутри перегруженного оператора мы заводим переменную res типа Vector для возврата через нее результата. Ее мы определяем через конструктор с двумя параметрами, который мы ранее написали для нашего класса. Сложение двух векторов происходит так, как и должно происходить - покоординатно.

В классе test мы испытываем наш перегруженный оператор. Все должно работать как и положено, и результат сложения должен вывестись на консоль в виде "x=3, y=1".

Основы c#. Урок 16. Перегрузка унарных операторов

Унарные операторы - это те, которые имеют только один операнд (параметр). Типичные примеры унарных операторов - это унарный минус (меняющий знак на противоположный) и оператор инкремента ++.

Рассмотрим перегрузку унарных операторов на примере рассмотренного на прошлом урокекласса Vector. А именно, добавим в наш класс унарный минус, который будет менять вектор с координатами x и y на вектор с координатами -x и -y. Для этого добавьте в наш класс Vector следующие строки:

public static Vector operator -(Vector v)

{

Vector res = new Vector(-v.x, -v.y);

return res;

}

Обратите внимание, что при перегрезке унарных операторов (как, впрочем, и преперегрузке бинарных), мы должны поставить модификатор static.

Для испытания перегруженного оператора изменить класс Test приблизительно следующим образом:

class Test

{

static void Main(string[] args)

{

Vector a=new Vector(1, 2), b;

b = -a;

Console.WriteLine("x=" + b.GetX() + ", "

+ "y=" + b.GetY());

}

}

Как и следовало ожидать, результатом выполнения программы будет вывод на экран строки "x=-1, y=-2".

Не надо думать, что при перегрузке операторов тип возвращаемого значения всегда совпадает с типом класса (для которого происходит перегрузка). Это зависит от конкретной задачи. Вот пример перегрузки оператора !, который возвратит модуль вектора:

public static double operator !(Vector v)

{

double res = Math.Sqrt(v.x*v.x + v.y*v.y);

return res;

}

Здесь мы воспользовались методом Sqrt класса Math для возврата квадратного корня. Sqrt - это статический метод класса Math, поэтому мы вызываем его не для конкретного экземпляра класса, а для самого класса. О статических методах мы поговорим позже, пока же измените тестовый класс Test следующим образом:

class Test

{

static void Main(string[] args)


{

Vector a=new Vector(3, 4);

Console.WriteLine(!a);

}

}

Наша программа должны вывести 5 (длину вектора (3, 4)).


Основы c#. Урок 17. Область видимости

Переменные существуют только в своей области видимости, при выходе из которой переменная "умирает". Область видимости переменной в первом приближении начинается в строке, где переменная объявлена и кончается на закрывающей фигурной скобке (переменная должна быть объявлена между этой скобкой и парной к ней открывающей). Вот поясняющий пример:

intk=3;

//Все OK, переменая k видна

Console.WriteLine(k);

Тут значение переменной k доступно и выведется на экран.

...

{

intk=3;

}

//Переменая k не видна

Console.WriteLine(k); //Ошибка!

В этом же примере вывести k на экран не получится - она умерла на закрывающей фигурной скобке.

Во вложенных областях видимости мы, как правило, не можем объявлять переменные с одинаковыми именами:

int k=4;

{

//Ошибка!

int k=3;

}

Исключение составляют параметры в методах класса:

class Vector

{

float x, y; //Координаты

...

public Vector(float x, float y)

{

this.x=x;

this.y=y;

}

Здесь мы имеем две пары одноименных переменных - x в параметре конструктора и x как переменная класса. Так как для уточнения переменной класса мы можем использовать this, то ошибки не будет.

Основы c#. Урок 18. Виртуальные функции

Как показано в уроке 13переменная базового класса может использоваться для хранения переменних производных классов. Но при этом мы не сможем использовать методы из производного класса. Сайчас мы с вами и посмотрим, как эту неприятность можно обойти. Для этого как раз и служит механизм виртуальных функций.

Если в родительском классе некоторая функция объявлена как виртуальная, то в производном классе ее можно переопределить. В этом, собственно говоря, ничего нового нет - этомы могли делать и без всяких виртуальных функций. Новое заключается в том, что если мы запишем в переменную типа родительского класса экземпляр проиводного, то для такого экземпляра мы сможем вызывать переопределенную функцию производного класса. Вот пример, поясняющий это:

usingSystem;

namespacetest

{

//Класс Worker

class Worker

{

protected int age=0;