Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# Лекция_1 Язык программирования и среда разра....docx
Скачиваний:
52
Добавлен:
18.12.2018
Размер:
1.81 Mб
Скачать
      1. Предварительные сведения о делегатах - функциональном типе данных

Уже говорилось, что одна из главных ролей класса состоит в том, чтобы задать описание типа данных. Каждый тип данных характеризует некоторое множество объектов - экземпляров класса. Класс, позволяющий описать некоторое множество объектов, каждый из которых является функцией, называется функциональным типом. В языке C# для описания функциональных типов используются классы, называемые делегатами, описание которых начинается с ключевого слова - delegate. Делегаты играют важную роль в языке C#, и их описанию будет уделено достойное внимание. Пока что нам достаточно знать, как выглядит описание делегата и как оно используется во многих задачах. Описание делегата представляет описание сигнатуры функций, принадлежащих одному функциональному типу. Под сигнатурой функции понимается описание числа, порядка и типов аргументов функции и типа возвращаемого значения. В языках программирования заголовок функции определяет ее сигнатуру. Пусть задан делегат

public delegate double DToD(double arg1);

Этот делегат задает описание класса с именем DToD (Double To Double), которому принадлежат все функции с одним аргументом типа double и возвращающие результат типа double. Функция , как и многие другие математические функции, соответствует этой сигнатуре и, следовательно, является объектом этого класса.

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

Формально у классов языка C# есть только методы и нет ключевых слов для таких понятий, как процедуры и функции. Фактически же любой метод представляет собой либо процедуру, либо функцию. Существуют синтаксические и содержательные различия в описании методов, представляющих процедуры и функции, в способах их вызова и применения. Подробнее об этом поговорим в соответствующем разделе курса, сейчас же заметим только, что в зависимости от контекста будем использовать как термин "метод", так и термины "процедура" и "функция".

      1. Класс TimeValue

Теперь уже можно привести код класса TimeValue со встроенным делегатом DToD, предоставляющий своим клиентам такой сервис, как оценка времени работы любого метода клиента, сигнатура которого согласована с делегатом. При необходимости этот класс всегда можно расширить, добавив соответствующие сервисы и новые делегаты. Вот этот код:

public class TimeValue

{

public delegate double DToD(double arg1);

/// <summary>

/// Возвращает время в секундах,

/// затраченное на вычисление count раз

/// метода fun с сигнатурой, которая удовлетворяет

/// делегату DToD (double to double)

/// </summary>

/// <param name="count">число повторений</param>

/// <param name="fun">имя функции</param>

/// <param name="x">аргумент</param>

/// <returns>время в милисекундах или тиках</returns>

public static double EvalTimeDToD(int count, DToD fun, double x)

{

DateTime start, finish;

double res = 0;

start = DateTime.Now;

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

fun(x);

finish = DateTime.Now;

//res = (finish- start).Ticks;

res = (finish - start).Milliseconds;

return res;

}

}

Время можно измерять в разных единицах, например, в тиках или миллисекундах. Статический метод EvalTimeDToD, реализующий сервис класса, устроен достаточно просто. Две переменные start и finish класса DateTime вызывают свойство Now, окаймляя цикл по числу повторов вызовов метода, функциональный тип которого задан делегатом, а имя передается в качестве фактического параметра при вызове метода EvalTimeDToD.

Еще одно важное замечание стоит сделать по поводу точности оценок, получаемых при использовании механизма объектов DateTime. Следует учитывать, что свойство Now не возвращает в точности текущее время в момент ее вызова. Это связано с механизмами операционной системы, когда в реальности на компьютере работают несколько процессов и система обработки прерываний имеет некоторый фиксированный квант времени при переключении процессов. Поэтому, запуская измерение времени вычислений на одних и тех же данных, можно получать различные данные с точностью, определяемой характеристиками системы прерываний. Это существенно не влияет в целом на получение временных характеристик, но не позволяет сравнивать методы, время выполнения которых сравнимо с погрешностью временных оценок.

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

Рис. 1.11. Сравнительные результаты точности и времени вычисления функции sin(x)

  1. Итоги

Эта лекция носит обзорный характер. В ней вводится много понятий из широкого круга областей, связанных как с языком программирования, так и средой разработки, операционной системой. По этой причине она может быть трудна для восприятия тех, кто только постигает начала программирования. Пусть Вас не смущает, если при ее чтении остались непонятные вещи. Надеюсь, что некоторое общее впечатление о процессе создания и выполнения проектов, написанных на языке C# и создаваемых в среде Visual Studio 2008, она все же дает. Хорошо было бы вернуться к чтению этой лекции уже после прохождения основного курса.

Еще большие сложности могут возникнуть при разборе примера, в котором я позволил себе на начальном этапе применять достаточно продвинутые и разнообразные средства языка C# и Visual Studio 2008. Тем не менее и в этом случае хотелось бы, чтобы Вы повторили все действия, которые связаны с построением Решения, включающего три проекта. Моя цель - продемонстрировать уже с первых шагов возможности языка C# по построению кода, отвечающего требованиям промышленного продукта.

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

На этом я закончу обзорное рассмотрение Visual Studio .Net и ее каркаса Framework .Net. Одной из лучших книг, подробно освещающих эту тему, является книга Джеффри Рихтера, переведенная на русский язык: "Программирование на платформе.Net Framework". Крайне интересно, что для Рихтера языки являются лишь надстройкой над каркасом, поэтому он говорит о программировании, использующем возможности исполнительной среды CLR и библиотеки FCL.