Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

После объявления переменной делегата можно вызвать метод с помощью делегата:

DoIt;

Или передать его в другой метод:

MethodThatTakesDelegate(DoIt);

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

void
, этот делегат является широковещательным делегатом и может одновременно представлять более одного метода. Вызов делегата заставляет все методы вызываться по очереди. Можно использовать операторы
+
и
+=
для добавления метода делегату, а
и
– =
— для удаления метода, который уже находится в делегате. Делегаты рассматриваются более подробно в главе 6.

События

События

являются специальной формой делегатов, которые используются для поддержки модели уведомления о событии с помощью обратного вызова. Событие имеет следующую сигнатуру:

delegate void EventClass(obj Sender, EventArgs e);

Это сигнатура, которую должен иметь любой обработчик событий с обратным вызовом. Ожидается, что

Sender
будет ссылкой на объект, который инициирует событие, в то время как
System.EventArgs
(или любой класс, производный из
EventArgs
, который также допустим в качестве параметра) является классом, используемым средой выполнения .NET для передачи базовой информации, имеющей отношение к деталям события.

Для объявления события используется специальный синтаксис:

public event EventClass OnEvent;

Клиенты используют синтаксис

+=
широковещательных делегатов для информирования, что они хотят получить уведомление.

// EventSource ссылается на экземпляр класса, который содержит событие

EventSource.OnEvent += MyHandler;

Источник просто вызывает событие, когда потребуется, используя такой же синтаксис, который был показан выше для делегатов. Так как событие является широковещательным делегатом, то все обработчики событий будут вызваны в ходе этого процесса. События рассматриваются более подробно в главе 6.

OnEvent(this, new EventArgs);

Атрибуты

Концепция атрибутов не имеет эквивалента в ANSI C++, однако атрибуты поддерживаются компилятором Microsoft C++ как специальное расширение Windows. В версии C# имеются классы .NET, которые выводятся из

System.Attribute
. Они могут применяться к различным элементам кода C# (классам, перечислениям, методам, параметрам и т.д.) для создания дополнительной документирующей информации в компилированной сборке. Кроме того, некоторые атрибуты распознаются компилятором C# и будут иметь влияние на компилированный код. Они включают следующие:

Атрибут Описание
DllImport
Указывает, что метод определен во внешней DLL.
StructLayout
Позволяет расположить содержимое структуры в памяти. Позволяет получить эквивалент
union
в C#.
Obsolete
Создает ошибку компилятора или предупреждение, если используется этот метод.
Conditional
Заставляет выполнить условную компиляцию. Этот метод и все ссылки на него будут игнорироваться, если присутствует определенный символ препроцессора.

Существует большое число других атрибутов, а также возможно задать свои собственные специальные атрибуты. Использование атрибутов рассматривается в главах 6 и 7.

Согласно синтаксису атрибуты указываются непосредственно перед объектом, к которому они применимы, в квадратных скобках. Это такой же синтаксис, как у атрибутов Microsoft C++.

[Conditional("Debug")]

void DisplayValuesOfImportantVariables {

 // и т.д.

Директивы препроцессора

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

#include
. (Она не требуется, так как в C# не используется предварительное объявление.)

Синтаксис директив препроцессора в C# такой же, как в C++. В C# поддерживаются следующие директивы:

Директива Значение
#define/#undef
Так
же как в C++, за исключением того, что они должны появиться в начале файла, до кода C#.
#if/#elif/#else/#endif
То же самое, что в C++
#ifdef/#elif/#else/#endif
.
#line
То же самое, что в C++
#line
.
#warning/#error
То же самое, что в C++
#warning/#error
.
#region/#endregion
Помечает блок кода как область. Области распознаются некоторыми редакторами (такими, как редактор VisualStudio.NET) и поэтому могут использоваться для улучшения компоновки кода, представленного пользователю при редактировании.

Пpиложение B

C# для разработчиков Java

В "Искусстве войны" Сунь Цзы утверждает, что "необходимо рассматривать вещи большой важности с небольшим усилием, а вещи небольшой важности с большим усилием". Это может звучать странно, но автор хочет, видимо, сказать, что если заботиться о незначительных вещах, то важные вещи тогда позаботятся о себе сами. Как это применимо к C# и Java?

При первом взгляде на код C# может показаться, что он не слишком впечатляющий, так как обнаруживается отчетливое сходство между ним и Java. Однако, если вы ожидали каких-то существенных изменений, то правда состоит в том, что на самом деле существует не так уж много синтаксических различий. Пути двух языков расходятся во внутренних тонкостях таких вещей, как перегрузка операторов, индексаторы, делегаты, свойства и перечисления с контролем типов. При более внимательном рассмотрении можно понять, что в конце концов между ними существует большое различие. (Приведенные выше темы будут подробнее рассмотрены позже в этом приложении.)

В этом приложении мы сосредоточимся прежде всего на вопросе, важном для разработчиков Java: как можно использовать в C# опыт использования Java, а также подчеркнем свойства присущие C#, и рассмотрим, что C# делать не может. Здесь предполагается, что читатель хорошо знаком с Java, поэтому отсутствует подробное описание языка Java, за исключением некоторых существующих различий.

Основы

Одно из основных различий между C# и Java лежит не в самом языке, а в платформе, поверх которой они реализованы. Программам Java требуется для выполнения кода рабочая среда времени выполнения Java Runtime Environment. C# и, на самом деле, вся платформа .NET выполняются в среде Common Language Runtime.

Большинство свойств CLR, внутреннее управление памятью, согласованность среды, масштабируемость и независимость от базовой платформы отражены в JRE Java. В то время, как JRE ограничена исключительно одним языком Java, CLR предоставляет поддержку и интеграцию нескольких языков с помощью VOS (virtual object system — система виртуальных объектов), которая предоставляет богатую типами систему, предназначенную для реализации множества различных типов языков программирования. Исходный код Java можно компилировать в промежуточное состояние, называемое байт-кодом. Он может затем выполняться с помощью поставляемой виртуальной машины. CLR, наоборот, не предоставляет виртуальную машину. Код C# также компилируется в промежуточное состояние, называемое для удобства промежуточным языком (IL, Intermediate Language). Но код IL передается в управляемые CLR процессы выполнения или компиляторам JIT CLR, обычно называемым JITters, которые преобразуют по требованию разделы IL в собственный код.

Давайте рассмотрим известный пример "Hello, World!" на Java (который будет показан здесь без затенения): 

public class Hello {

 public static void main(String args[]) {

System.out.println("Hello world! This is Java Code!");

 }

}

Соответствующий код C# для этого примера следующий (представлен на сером фоне):

public class Hello {

 public static void Main(string[] args) {

Поделиться с друзьями: