Главная страница

ИГА. Понятие базы данных


Скачать 0.77 Mb.
НазваниеПонятие базы данных
Дата05.04.2022
Размер0.77 Mb.
Формат файлаdocx
Имя файлаИГА.docx
ТипДокументы
#445246
страница25 из 37
1   ...   21   22   23   24   25   26   27   28   ...   37

Делегаты в классах C#.


Делегат представляет собой объект, который может ссылаться на метод. Следовательно, когда создается делегат, то в итоге получается объект, содержащий ссылку на метод. Более того, метод можно вызывать по этой ссылке. Иными словами, делегат позволяет вызывать метод, на который он ссылается.

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

Интересным и полезным свойством делегатов является то, что они не заботятся о типе объекта, на который они указывают. Подойдет любой. Это делает делегаты прекрасным аппаратом для анонимных вызовов. При использовании делегата необходимо сделать три вещи: объявить делегат, создать его экземпляр и вызвать. Делегаты объявляются при помощи синтаксиса объявления делегатов. Например делегат без аргументов, возвращающий void может быть описан следующим образом:

delegate void SimpleDelegate();

Для создания нового экземпляра делегата используется ключевое слово new. После того как делегат создан его можно вызывать как метод. Пример:

class Test

{

static void F() {

System.Console.WriteLine("Test.F");

}

static void Main() {

SimpleDelegate d = new SimpleDelegate(F);

d();

}

}

SimpleDelegate создается и сразу вызывается.

Конечно нет смысла в описании делегата, только для того чтобы его сразу вызвать, короче было бы просто вызвать нужный метод. Делегаты хороши, когда они вызывают метод анонимно. Например мы можем определить метод MultiCall, который будет циклически вызывать SimpleDelegate:

void MultiCall(SimpleDelegate d, int count) {

for (int i = 0; i < count; i++)

d();

}

}

Обобщенные классы или шаблоны.


Ниже приведена общая форма объявления обобщенного класса:

class имя_класса<список_параметров_типа> { // ...

А вот как выглядит синтаксис объявления ссылки на обобщенный класс:

имя_класса<список_аргументов_типа> имя_переменной =

new имя_класса<список_параметров_типа> (список_аргументов_конструктора);

Давайте рассмотрим пример использования нескольких обобщенных классов:

namespace ConsoleApplication1

{

// Создадим обобщенный класс имеющего параметр типа T

class MyObj

{

T obj;
public MyObj(T obj)

{

this.obj = obj;

}
public void objectType()

{

Console.WriteLine("Тип объекта: " + typeof(T));

}

}
// Обобщенный класс с несколькими параметрами

class MyObjects

{

T obj1;

V obj2;

E obj3;
public MyObjects(T obj1, V obj2, E obj3)

{

this.obj1 = obj1;

this.obj2 = obj2;

this.obj3 = obj3;

}
public void objectsType()

{

Console.WriteLine("\nТип объекта 1: " + typeof(T)+

"\nТип объекта 2: " + typeof(V) +

"\nТип объекта 3: " + typeof(E));

}

}
class Program

{

static void Main()

{

// Создадим экземпляр обобщенного класса типа int

MyObj obj1 = new MyObj(25);

obj1.objectType();
MyObjects obj2 = new MyObjects("Alex",26,12.333m);

obj2.objectsType();
Console.ReadLine();

}

}

}

Использование обобщений C#

Когда для класса MyObj указывается аргумент типа, например int или string, то создается так называемый в С# закрыто сконструированный тип. В частности, MyObj является закрыто сконструированным типом. Ведь, по существу, такой обобщенный тип, как MyObj, является абстракцией. И только после того, как будет сконструирован конкретный вариант, например MyObj, создается конкретный тип. А конструкция, подобная MyObj, называется в С# открыто сконструированным типом, поскольку в ней указывается параметр типа Т, но не такой конкретный тип, как int.

В С# чаще определяются такие понятия, как открытый и закрытый типы. Открытым типом считается такой параметр типа или любой обобщенный тип, для которого аргумент типа является параметром типа или же включает его в себя. А любой тип, не относящийся к открытому, считается закрытым. Сконструированным типом считается такой обобщенный тип, для которого предоставлены все аргументы типов. Если все эти аргументы относятся к закрытым типам, то такой тип считается закрыто сконструированным. А если один или несколько аргументов типа относятся к открытым типам, то такой тип считается открыто сконструированным.

И еще один момент. В связи с изложенным выше возникает следующий резонный вопрос: если аналогичные функциональные возможности обобщенного класса MyObj можно получить и без обобщений, просто указав объект как тип данных и выполнив надлежащее приведение типов, то какая польза от того, что класс MyObj делается обобщенным? Ответ на этот вопрос заключается в том, что обобщения автоматически обеспечивают типовую безопасность всех операций, затрагивающих класс MyObj. В ходе выполнения этих операций обобщения исключают необходимость обращаться к приведению типов и проверять соответствие типов в коде вручную.
1   ...   21   22   23   24   25   26   27   28   ...   37


написать администратору сайта