ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.08.2024
Просмотров: 1107
Скачиваний: 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
{
//Объявление делегата.
delegate void EventHandler();
//Объявление класса с событием.
classMyEvent
{
//Объвление события на основе делегата.
public event EventHandler f;
//Объвление метода, в котором вызывается событие.
public void func()
{
f();
}
}
//Класс для тестирования события класса MyEvent.
classTest
{
//Обработчик для события.
public static void z()
{
Console.WriteLine("Вызов обработчика");
}
//Метод main.
static void Main(string[] args)
{
//Создаем экземпляр класса с событием.
MyEvent w=new MyEvent();
//Добавление обработчика события.
w.f+=new EventHandler(z);
//Вызов метода, в котором вызывается событие.
w.func();
}
}
}
Сначала мы в строке
...
delegate void EventHandler();
...
объявляем делегат. Параметров у него нет (хотя могут и быть), тип - void.
Затем мы объявляем класс MyEvent, внутри которого объвляем событие f (имя произвольное):
...
public event EventHandler f;
...
Синтаксис тут такой - модификатор доступа (у нас public), затем ключевое слово event, потом имя делегата, на основании которого мы создаем наше событие (у нас это EventHandler) и, наконец, имя произольное событие (f). Обратите внимание, что событие появится на вкладке ClassView:
Далее в нашем классе с событиями мы в некотором методе это событие вызываем:
...
public void func()
{
f();
}
...
Класс с событием создан. Далее мы пишем класс Test для тестирования события. В этом классе мы создаем обработчик z для события (имя обработчика произвольное). Этот метод мы объвляем как статический.
Далее мы объявляем экземпляр нашего класса MyEvent (того самого, в котором мы объявили событие):
...
MyEvent w=new MyEvent();
...
Остается теперь указать, что за обработчик будет у события f класса MyEvent. Это мы делаем в строке
...
w.f+=new EventHandler(z);
...
Этой строчкой мы указываем, что событие f будет обрабатывать метод z класса Test.
Если мы запустим наше программу, то на вызовется обработчик для события (т. е. выведется надпись "Вызов обработчика"):
Обратите внимание, что обработчик для события мы пишем в тестовом классе (т. е. в классе Test, в котором мы объявили экземпляр нашего класса с событиями). Так мы делаем всегда, и не только на пратформе .NET.
Основы c#. Урок 35. Введение в атрибуты
Сначала несколько слов о том, что такое атрибуты. Итак, атрибут - это некоторая дополнительная информация, которая может быть приписана к типам, полям, методам, свйствам и некотрым другим конструкциям языка. Атрибуты поещаются в исполняемый файл и могут оттуда при необходимости извлекаться.
Все атрибуты (в отличие, скажем, от атрибутов языка IDL) являются классами (потомками класса System.Attribute). В отличие от атрибутов IDL набор атрибутов .NET открыт для дополнения, т. е. вы можете определять собственные атрибуты и применять их к вышеуказанным элементам вашего кода.
Атрибуты делятся на предопределенные (встроенные) и пользовательские (которые пишет программист).
Встроенные атрибуты могут использоваться, например, при сериализации (сохранении в поток) данных класса. Скажем, вам надо, чтобы у класса сохранялись не все данные - в этом случае вы можете пометить те данные, которые не надо сохранять, специальным атрибутом.
Еще пример применения атрибутов. Компоненты, которые вы располагаете на форме (кнопки, метки и т. п.) имеют некоторый набор свойств (шрифт, местоположение, видимость и т. п.). В IDE Visual Studio вы можете выбрать в окне Properties один из двух способов расположения этих свойств - по алфавиту или по категориям. Так вот, в какую категорию попадет то или иное свойство, определяется специальным встроенным атрибутом.
Атрибуты в C# заключаются в квадратные скобки.
Основы c#. Урок 36. Пример пользовательского атрибута.
Вот пример определения и использования пользовательского атрибута:
usingSystem;
namespacetest
{
//Объявление атрибута.
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
class TestAttribute: System.Attribute
{
//Поле атрибута.
private string name;
//Конструктор атрибута.
public TestAttribute(string name)
{
this.name = name;
}
//Свойство только для чтения.
public virtual string Name
{
get
{
return name;
}
}
}
//Конец объявления атрибута.
//Применение атрибута к классу.
[TestAttribute("Igor Alexeev")]
class Test
{
static void Main()
{
GetAttribute(typeof(Test));
}
public static void GetAttribute(Type t)
{
TestAttribute att=
(TestAttribute) Attribute.GetCustomAttribute(t, typeof(TestAttribute));
Console.WriteLine("{0}", att.Name);
}
}
}
Как видно, атрибут TestAttribute является потомком класса System.Attribute (как всегда). Перед определением нового атрибута мы видим строку
...
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
...
Этой строкой определяется область применения нашего атрибута - первый параметр (AttributeTargets.All) говорит о том, что мы сможем применять наш атрибут TestAttribute к чему угодно, второй (Inherited=false) - что атрибут не будет наследоваться (т. е. если мы применим атрибут TestAttribute к некоторому классу, то у потомков этого класса атрибута TestAttribute не будет), третий (AllowMultiple = true) - что атрибут к каждому элементу может пременяться только один раз (заметим в скобках, что для определения области применения нашего пользовательского атрибута мы используем другой атрибут - AttributeUsage).
Далее мы определяем для нашего атрибута внутреннюю переменную name типа string и конструктор с параметром типа string. В конструкторе мы записываем значение в переменную name. Еще чуть ниже мы пишем в классе атрибута свойство только для чтения:
...
public virtual string Name
{
get
{
return name;
}
}
...
После создания класса атрибута мы применяем его к другому классу Test. Для этого мы должны создать экземпляр атрибута TestAttribute непосредственно перед классом Test:
...
[TestAttribute("Igor Alexeev")]
classTest
{
...
Делаем мы это в квадратных скобках. При этом у нас вызывается конструктор с параметром атрибута.
В классе Test мы в методе GetAttribute просто выводим на консоль значение свойства name атрибута. Для этого мы воспользовались статическим методом GetCustomAttribute класса Attribute. Этот метод принимает в качестве параметров тип, к которому атрибут применяется (т. е. класс Test в нашем случае) и собственно атрибут, который мы применяем (у нас это TestAttribute). Возвращает же он экземпляр атрибута, который мы и используем для получения значения свойства name.
Метод GetAttribute мы вызываем в констукторе класса Test.
Результатом выполнения нашей программы будет вывод на консоль слов "Igor Alexeev".
Основы c#. Урок 37. Параметры командной строки
Параметры командной строки передаются, естественно, в методе Main. В отличие от некоторых языков программирования (C/C++) параметр только один - это массив передаваемых параметров. Аналога первого параметра языка C/C++ (количества параметров) нет. Передаются параметры в виде массива строк.
Вот пример прораммы, выводящий на экран все передаваемые в нее параметры командной строки и их количество:
usingSystem;
namespacetest
{
classTest
{
//Передаем в Main параметры командной строки.
static void Main(string[] args)
{
//Выводим количество параметров.
Console.WriteLine(args.GetLength(0));
//Выводим каждый параметр.
foreach (string s in args)
{
Console.WriteLine(s);
}
}
}
}
Обратите внимание, что в сам exe-файл не считается параметром (как в C/C++).
Основы c#. Урок 38. Метод Main в отдельном классе
До этого мы в большинстве случае помещали метод Main в тот же класс, который испытывали:
usingSystem;
namespacetest
{
classTest
{
//... (поля, методы, ... класса)
static void Main()
{
//...
}
}
}
Но для больших, настояших программ это не самый лучший способ. Гораздо лучше вынести метод Main в отдельный класс:
usingSystem;
namespacetest
{
class Test
{
//... (поля, методы, ... класса Test)
}
//Класс приложения для вызова метода Main.
class App
{
static void Main()
{
//Создаем экземпляр класса Test.
Test c = new Test();
//...
}
}
}
Вообще говоря в программе у вас, как правило, будет много классов. И лучше каждый из них хранить в отельном файле (с расширением *.cs).
Основы c#. Урок 39. Форматированный вывод
Для вывода на консоль мы использовали следующую конструкцию:
...
intx=23, y=-4;
...
Console.WriteLine("x={0}, y={1}", x, y);
...