Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Стандартный делегат для обработки событий

Обобщённые коллекции

Гарантируют повышенную безопасность типа. Содержатся в

System.Collections.Generic. Наиболее используемые:

· List<T>(список элементов типа Т с динамически меняющимся размером)

· Dictionary<K,V>(обобщённая коллекция пар имя/значение)

· Queue<T>(обобщённая очередь элементов типа Т)

· SortedDictionary <K,V>(обобщённая реализация сортированного

множества пар имя/значение)

· Stack<T>(обобщённый стек элементов типа Т)

· LinkedList<T>(обобщённая реализация двузначного списка)

БИЛЕТ 12

Делегаты – безопасный в отношении типов объект, указывающий на другой

метод (или список методов) приложения, который может быть вызван позднее.

Объект делегата содержит:

· Адрес метода, на котором он вызывается

· Аргументы (если есть) этого метода

· Возвращаемое значение (если есть) этого метода

Делегат указывает вызов метода в коде, но вызываемый метод определяется во

время работы программы, а не во время компиллироования. Вызываемый метод

может быть методом экземпляра, ассоциированным с объектом или статическим

методом, ассоциированным с классом.

Для определения делегата используется ключевое слово delegate. Имя делегата

может быть любым, однако сигнатура должна соответствовать сиггнатуре метода,

вызываемого делегатом. Пример: делегат, вызывающий любой метод метод,

принимающий в качестве входных данных два целых числа и возвращающий

целое число(сложение, умножение…)

public delegate int BinaryOp (int x, int y);

//класс, содержащий методы для делегата

public class SimpleMath

{

public int Add(int x, int y)

{return x+y;}

public int Sub(int x, int y)

{return x-y}

public static int Square(int x, int y)

{return a*a;}

}

class Program

{

static void Main(string[]args)

{

SimpleMath m = new SimpleMath();

BinaryOp b = new BinaryOp(m.add);

Console.WriteLine(b(10,10));

}

}

Многоадресность делегатов – способность делегата хранить несколько ссылок

на различные методы, что позволяет при вызове делегата инициировать эту

цепочку методов. Для создания цепочки методов необходимо создать экземпляр

делегата и, пользуясь операторами + или +=, добавлять методы к цепочке.

Для удаления метода из цепочки используем – или – =.

public delegate int BinaryOp (int x, int y);

public class SimpleMath

{

public int Add(int x, int y)

{return x+y;}

public int Sub(int x, int y)

{return x-y}

public static int Square(int x, int y)

{return a*a;}

}

static void Main()

{

BinaryOp a, b, c, d;

a = Add;

b = Sub;

c = a+b;

d = c–a;

}

 

БИЛЕТ 13

События

События позволяют упростить работу с делегатами.

События определяются ключевым словом event, именем

делегата и собственным именем:

public class SenderOfEvents

{

public delegate retval AssociatedDelegate(args);

public event AssociatedDelegate NameOfEvent;

...

}

Пример программы, реализующей событие:

{

public delegate void MyEventHandler();//Делегат,

связанный с событием

class TestEvent

{

public event MyEventHandler Triggerlt;//Событие с

// использование делегата MyEventHandler

public void Trigger()//Метод, инициирующий событие

{

Triggerlt();

}

public void MyMethod1()

{

Sistem.Console.WriteLine("Hello!");

}

public void MyMethod2()

{

Sistem.Console.WriteLine("Hello again!");

}

public void MyMethod3()

{

Sistem.Console.WriteLine("Good-bye!");

}

static void Main()

{

TestEvent myEvent = new TestEvent();

myEvent.Triggerlt += newMyEventHandler(myEvent.MyMethod1);

myEvent.Triggerlt += newMyEventHandler(myEvent.MyMethod2);

myEvent.Triggerlt += newMyEventHandler(myEvent.MyMethod3);

//Подписались на 3 метода

myEvent.Trigger();//Инициировали событие

myEvent.Triggerlt -= newMyEventHandler(myEvent.MyMethod2);

myEvent.Trigger();

}

}

}

Стандартный делегат для обработки событий

Для обработки большинства событий, возникающих при создании

интерфейса, используется стандартный делегат, возвращающий void

и имеющий два параметра типа object и eventArgs:

{

public delegate void EventHandler(object sender, EventArgs e);

...

class Car

{

public event EventHandler CarEvent;

void SomeMethod

{

if (CarEvent!=null)

{

CarEvent(this, New EventArgs());

}

}

public static void ForCarMet(object sender, EventArgs e)

{

Car c = (car).sender;

if(c.CarSpeed > 60)

{

Console.Write("Ух!!!");

}

}

}

public class EventArgs

{

public static readonly

Sistem.EventArgs Empty();

public EventArgs()

{}

}

}

Если необходимо передовать какую-то особенную информацию при генерации

события, то создаётся класс-наследник класса EventArgs.

В этом классе описываются поля, представляющие эту особенную информацию

и в дальнейшем для описания событий используется обобщённый делегат

EventHandler<T>(object sendler, T e):

{

class Car

{

public event EventHandler<CarEvents> CarExploded;

public event EventHandler<CarEvents> CarAboutToFollow;

...

void SpeedUp(int delta)

{

if(CarIsDead && CarExploded!=null)

{

CarExploded(this, new CarEvents("машины нет..."));

}

}

}

}

 

БИЛЕТ 14

Перегрузка операторов

C# позволяет производить перегрузку(переопределение) операторов:

· Унарные: +, -,!, ~, ++, --, true, false

· Бинарные: +, -, *, /, %, &, |, ^, <<, >>, = =,!=, >, >, >=, <=

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

public static ComplexNumber operator + (ComplexNumber a, ComplexNumber b)

{

return new ComplexNumber(a+b-3);

}

Преобразование типов

· Числовые преобразования (sbyte, int, float...)

Явное преобразование требуется при попытке сохранить

большее значение в меньшем контейнере

(что может привести к потере данных)

Неявное преобразование происходит автоматически,

при помещении меньшего типа в больший

Static void Main()

{

int a = 123;

long b = a; //неявное

int c = (int)b; //явное

}

· Преобразования между связанными типами классов

Класс-наследник всегда может быть неявно приведён к

базовому классу.

Если требуется явное приведение:

{

class Base { }

class Derived: Base { }

class Program

{

static void Main(string[] args)

{

Base a;

a = new Derived(); //неявное

Derived b = (Derived)a; // для хранения базовой ссылки в

// ссылке на наследника нужно явное преобразование

}

}

 

}

· Преобразование между неимеющих общего предка классов

Пример: преобразование структуры Rectangle в Square:

Rectangle rect;

rect.Width = 3;

rect.Height = 10;

Square sq = (Square)rect;

БИЛЕТ 15

Обобщения (generic) – средство для получения более гибкого способа

управления данными в приложениях.

Основные проблемы необобщённых коллекций

(ArrayList, Hashtable, Queue, SortedList, Stack):

1. низкопроизводительный код

2. низкий уровень безопасности в отношении типов

3. …

Учитывая данные и другие проблемы, разработчики добавили

новое пространство имён Sistem. Collectiions. Generic. А в нём,

в свою очередь, новый набор классов коллекций – обобщённых коллекций

(List<>, Dictionary<K,V>, Queue<T>, SortedDictionary<K,V>,

Stack<T>, LinkedList<T>...)

List<> - список элементов типа Т с динамически изменяемым размером

Dictionary<K,V> - обобщённая коллекция пар имя/значение

Queue<T> - обобщённая очередь элементов типа Т

SortedDictionary<K,V> - обобщённая реализация сортированного

множества пар имя/значение

Stack<T> - обобщённый стек элементов типа Т

LinkedList<T> - обобщённая реализация двусвязного списка

Методы и применение обобщённых коллекций рассмотрим на примере:

Static void Main(string[] args)

{

//Создаём список, содержащий целочисленные значения

List<int> myInts = new List<int>();

//помещаем в список элементы

myInts.Add(5);

int x = 10;

myInts.Add(x);

//Создаём список, содержащий объекты Employee

List<Employee> otdel =new List<Employee>();

otdel.Add(new Manager());

otdel.Add(new SalesPerson());

Console.WriteLine(“в отделе работает {0} людей”, otdel.count);

}

 

 

БИЛЕТ 17

.Net сборки – имеющий версию, самоописываемый двоичный файл,

обслуживаемый Common Language Run-time (CLR).

Можно считать, что сборка – это библиотека. Сборки определяют

границы типов. Полностью клалифицированно е имятипа

получается из добавления к имени типа имени его пространства имён.

1. сборка, в которой находится его тип, определяет его сущность

2. сборки поодерживают версию:

<старший номер>.<младший номер>.<номер сборки>.<номер редакции>

3. сборки содержат информацию о каждой из сборок, к которым нужен

доступ, содержат метаданные, внутри которых вписана структура каждого

класса, интерфейса, метода…, содержащегося внутри данной сборки

4. сборки поддаются конфигурированию

Частные сборки

Частные сборки предназначены для использовании в одном приложении.

Когда среда CLR ищет частную сборку, она использует частное имя сборки

(хранится в метаданных), причём поиск осуществляется в корневом каталоге
и дочерних подкаталогах.

Общие сборки (сборки со строгим именем)

Строгое имя сбоки состоит из частного имени, версии, открытого, закрытого

ключей и обеспечивает более высокий уровень безопасности сборки и позволяет

использовать одну сборку в нескольких приложениях. Строгое имя уникально,

оно не позволяет заменить одну сборку другой, что крайне важно, в частности,

для коммерческих организаций. Сборка со строгим именем может храниться как

любой папке ПК, так и за пределами его(в сети), но чаще всего общие сборки

хранятся в GAC(Global Assembly Cache) – централизованном хранилище сборок.

В результате – экономия размера приложения. Хранящиеся в GAC сборки

публичны, если нам нужно избежать этого – помещаем сборку в корневую

папку приложения. Общие сборки могут ссылаться только на общие сборки.

Для настройки общей сборки необходимо вставить в проэкт конфигурационный

файл с именем подкаталога, в котором хранится сборка, на месте X:

<configuration>

<runtime>

<assemblyBinding xmlns=”urn:schemas-

microsoft-com:asm.vl”>

<probing privatePath=”X”/>

</assemblyBinding>

</runtime>

</configuration>

 



<== предыдущая лекция | следующая лекция ==>
Методическая поддержка работы по развитию речи дошкольников | 
Поделиться с друзьями:


Дата добавления: 2016-12-18; Мы поможем в написании ваших работ!; просмотров: 610 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Чтобы получился студенческий борщ, его нужно варить также как и домашний, только без мяса и развести водой 1:10 © Неизвестно
==> читать все изречения...

2407 - | 2289 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.