Сообщение от меня 31.01.2016 на странице http://rchannel.azurewebsites.net/ChannelR/Details/7
ПОДНИМАЙТЕ БАЛКУ ВЫШЕ С СОБЫТИЯМИ, НАСЛЕДОВАНИЕМ, НАПРАВЛЕНИЕМ НИТИ… ПЫТАЙТЕСЬ НА СВОЙ СОБСТВЕННЫЙ РИСК.
НЕОБХОДИМЫЕ УСЛОВИЯ
- Незнание среднего уровня программирования на C #
- Отсутствие Microsoft Visual Studio Ultimate или Express для Windows 2012–2015 гг.
Шучу, нужно, чтобы вышеперечисленное было. :)
А. ДЕЛЕГАТЫ
Делегаты позволяют ссылаться и выполнять несколько методов одновременно. (Делегат = указатель на функцию)
1. Создайте новое консольное приложение.
2. В методе Main program.cs введите:
delegate void myDelegate(string msg);
delegate void myDelegate(string message);
---- ›Объявление делегата с именем myDelegate
Подсказка: синтаксис, используемый для объявления делегата, аналогичен синтаксису, используемому для определения метода с ключевым словом делегата в нем.
void
---- ›возвращаемый тип. этот делегат будет принимать только методы с возвращаемым типом void в качестве значения.
delegate
---- ›ключевое слово, используемое для создания делегата.
(string msg)
---- ›для работы делегату потребуются методы с 1 одностроковым параметром.
2. Помимо основного метода, определите следующие методы:
static void showMsg1(string message)
{
Console.WriteLine("Hello " + message);
}
static void showMsg2(string message)
{
Console.WriteLine("Welcome abord the Delegate ship. " + message);
}
3. Внутри метода Main введите:
MyDelegate objD = new MyDelegate(showMsg1);
MyDelegate objD = new MyDelegate
---- ›Создание экземпляра объекта делегата 'objD'. Обратите внимание, что делегаты могут быть созданы так же, как классы.
(showMsg1)
---- ›Инициализация метода showMsg1 для делегата.
objD += showMsg2;
myFunc += showMsg2;
---- ›Инициализировать метод showMsg2 для делегата myFunc
+=
---- ›myFunc = myFunc + showMsg2;
objD("Tom");
Console.ReadLine();
Результат:
Привет, Том
Добро пожаловать на борт корабля делегатов. Том
Б. СОБЫТИЕ
Событие - это особый тип делегата. Вы можете только добавить + = к событию или удалить - = методы из события. Примером события является то, что вы щелкаете левой кнопкой мыши, чтобы открыть Google Chrome (событие mouse left_click).
1. Создайте новое консольное приложение.
2. В program.cs создайте новый класс «Человек».
В классе «Человек»; тип:
class Person
{
public event EventHandler OnPropertyChange;
event
---- ›Ключевое слово, используемое для объявления события.
EventHandler
---- ›Делегат; используется, когда у нас нет информации о мероприятии.
string name ="";
public string Name
{
get
{
return name;
}
set
{
name = value;
Мы хотим вызывать это событие всякий раз, когда изменяется значение свойства (имя).
OnPropertyChange(this, new EventArgs());
}
}
onPropertyChange(this, new EventArgs()); ---->
Запускает событие после изменения значения свойства.
this
---- ›В текущем контексте ключевое слово this используется для ссылки на объект класса Person.
new EventArgs()
---- ›EventArgs() class
предоставляет значение для использования для событий, которые не содержат информации о событии.
}
3. В классе программ ›Главное событие введите:
Person objP = new Person();
objP.OnPropertyChanged += objP_OnPropertyChange;
+= objP_OnPropertyChange
---- ›Добавьте к событию метод с именем objP_OnPropertyChange.
Подсказка ---- ›Чтобы автоматически создать objP_OnPropertyChange method,
после +=
, дважды нажмите: tab
.
objP.Name = "Tony Stark";
4. Вне главного события введите:
static void objP_OnPropertyChange(object sender, EventArgs e)
{
object sender
---- ›Объект, из которого произошло событие (в данном случае событие возникает в объекте свойства change 'name' из класса Person)
EventArgs e
---- ›Информация об аргументах события
Console.WriteLine("Sometimes you gotta run before you can walk.");
Console.ReadLine();
}
Результат. Иногда нужно бегать, прежде чем ходить.
C. НАЗВАНИЯ
пространства имен позволяют нам иметь набор классов с тем же именем, отделенных друг от друга. Другими словами, пространства имен предотвращают возникновение конфликтов за счет наличия классов с одинаковыми именами.
1. Создайте новое консольное приложение.
2. В Program.cs за пределами пространства имен ProgramName {…} введите:
namespace TeamA
{
class Test
{
public static void Go()
{
}
}
}
namespace TeamB
{
class Test
{
public static void Go()
{
}
}
}
3. В методе Main введите:
TeamA.Test.Go();
TeamA.Test.Go();
---- ›Доступ к методу тестового класса из пространства имен Team A
Подсказка: Вверху вместе с другими операторами using введите:
using TeamA
Теперь вы можете просто получить доступ к своему методу класса Test, набрав:
Test.Go();
Возможно, вы использовали пространства имен бессознательно; например, когда вы набираете: Console.WriteLine (...); В вашей программе есть ключевое слово using System. Действительно, класс Console присутствует в пространстве имен System.
D. НАСЛЕДОВАНИЕ
Вы спросите, зачем использовать наследование?
Допустим, вы создали класс с некоторыми свойствами и некоторыми методами. Теперь вы хотите, чтобы в других ваших классах эти методы и свойства были автоматически добавлены в них. Что ж, для этого не нужно быть красивой обезьяной. Наследование здесь, чтобы помочь.
1. Создайте новое консольное приложение.
2. В program.cs вне метода Main введите:
class Person
{
public string Name;
public void myMethod()
{
Console.WriteLine(Name);
Console.ReadLine();
}
}
class Employee : Person
{
public string department;
}
class Employee : Person
---- ›Наследование; класс не может наследовать более чем от 1 класса
Employee : Person
---- ›Класс Employee наследуется от класса person.
Подсказка: Здесь класс человека - это суперкласс (базовый класс), от которого наследуется класс Employee.
3. В методе Main введите:
Employee objEmp = new Employee();
objEmp.Name = "Tom";
objEmp.Name = "Tom";
---- ›Обратите внимание, что класс Employee теперь содержит переменные, методы и свойства класса Person.
objEmp.department = "Software Engineering";
objEmp.department = "Software Engineering";
---- ›При наследовании от класса Person класс Employee не теряет никаких собственных переменных, методов и свойств.
objEmp.myMethod();
E. МОДИФИКАТОРЫ ЗАЩИЩЕННОГО ДОСТУПА
1. Создайте новое консольное приложение.
2. В Program.cs вне класса Program введите:
class Person
{
protected string Name;
}
3. В главном событии введите:
Program objP = new Program();
objP.Name = "Jake Roper";
objP.Name = "Jake Roper";
---- ›Логическая ошибка« ApplicatioName.Person.Name недоступен из-за уровня защиты ».
Доступ к переменным и свойствам с модификатором защищенного доступа можно получить только в том классе, в котором они были определены (класс Person). Если только они не унаследованы другими классами!
4. Исправить эту логическую ошибку; Сделайте класс Program унаследованным от класса Person.
class Program : Person
Задача. Если вы решите принять ее, ваша миссия - применить следующие модификаторы доступа. Не стесняйтесь сообщать о своих результатах в разделе комментариев.
ModifierClassSubclassPublic ✓ ✓ Без модификатора ✓✗Private ✓✗
Подсказки:
1. Подкласс - это производный класс; например, мы использовали класс Program в качестве подкласса в вашем предыдущем упражнении.
2. По умолчанию, если модификатор доступа не указан, выбирается модификатор частного доступа.
F. ОСНОВЫ ОТРАЖЕНИЯ
Не паникуйте, ради этого возмутительного руководства по C # продвинутое кодирование Reflection будет рассмотрено в учебнике Ultimate C #.
Использование отражения
Отражение обычно используется дизайнерами пользовательского интерфейса. В Microsoft Visual Studio, когда вы перетаскиваете кнопку в Windows Form или приложении ASP.NET, окно свойств использует отражение для отображения всех свойств этой кнопки, таких как свойства BackColor и BackgroundImage, как показано на снимке экрана ниже:
1. Создайте новое консольное приложение с именем MyReflection.
2. В пространстве имен myReflection, но за пределами класса Program, введите:
public class Employee
{
public int ID { get; set; }
public string FullName { get; set; }
}
3. Добавьте следующий оператор using вверху среди других операторов using в файл program.cs:
Using System.Reflection;
4. В основном методе введите:
Type myType = Type.GetType("MyReflection.Employee");
Type myType = Type.GetType("MyReflection.Employee");
---- ›_ 101_ Получите информацию о свойствах класса Employee и сохраните ее в переменной myType.
Type
---- ›Класс
.GetType
---- ›методу требуется Namespace.ClassName в качестве параметра для возврата информации о свойствах класса.
PropertyInfo[] myProperties = myType.GetProperties();
PropertyInfo[]
---- ›Сохраните свойства класса Employee в массиве типа данных PropertyInfo.
myType.GetProperties();
---- ›метод GetProperties используется для получения свойств класса Employee.
foreach (PropertyInfo item in myProperties)
{
Console.WriteLine(item.PropertyType + " " + item.Name);
}
Console.ReadLine();
5. Запустить приложение.
Результаты:
Идентификатор System.Int32
System.String FullName
G. РЕЗЮМЕ
Ключевое слово Abstract образовано от английского слова abstraction, которое означает удаление.
Абстрактные классы
1. Создайте новое консольное приложение.
2. В программном классе program.cs ›создайте абстрактный класс, набрав:
Быстрые советы:
- Абстрактные члены, такие как свойства и методы, не могут быть закрытыми.
- Класс, содержащий один или несколько абстрактных членов, должен быть определен как абстрактный класс.
abstract class myClass
{
public static string MyName { get; set; }
public static void Hello()
{
Console.WriteLine("Hello World");
Console.ReadLine();
}
}
3. В главном событии введите:
myClass A = new myClass();
myClass.Hello();
4. Запустите заявку.
Результат:
Обратите внимание, что абстрактные классы не могут быть созданы. Хорошо, что мы использовали статические свойства и методы, просто следующий код из вашей программы и готово:
myClass A = new myClass();
Тем не менее абстрактные классы могут быть унаследованы производными классами, но для простоты мы рассмотрим это в учебнике Ultimate C #.
З. РЕЗЬБА
Thread = Легкий процесс
Чтобы просмотреть процессы, запущенные в настоящее время в вашей операционной системе Microsoft Windows:
1. Щелкните правой кнопкой мыши на панели задач.
2. Щелкните Запустить диспетчер задач.
Чтобы применить концепцию многопоточности в своем приложении:
1. Создайте новое консольное приложение.
2. Добавьте следующий оператор using:
Using System.Threading
3. В program.cs введите:
static void WriteX()
{
for (int i = 0; i < 2000; i++) Console.Write(" X");
}
4. В главном событии введите:
Thread t = new Thread(WriteX);
Thread t
---- ›Объявить новую тему
_118 _---- ›Инициализируйте поток с помощью метода WriteX
t.Start();
t.Start();
---- ›Выполнить метод WriteX ()
ДЕЛАТЬ ЧТО-ТО БЕЗ ОЖИДАНИЯ МЕТОДА WRITEX ДЛЯ ЗАВЕРШЕНИЯ ЗАПУСКА ОТ РЕЗЬБЫ T.
for (int i = 0; i < 2000; i++) Console.Write(" O");
Console.ReadLine();