Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инфа.doc
Скачиваний:
12
Добавлен:
04.06.2015
Размер:
766.98 Кб
Скачать

В отличие от оператора for оператор while никак не изменяет значения пере-

переменной цикла, поэтому мы должны позаботиться об этом сами.

Перед тем как приступить к выполнению цикла, мы устанавливаем начальное зна-

значение параметра цикла i, равное нулю. После выполнения тела цикла мы сами изме-

изменяем значение параметра цикла, увеличивая его на единицу.

Цикл будет прерван, как только значение переменной i превысит 10.

В цикле while можно использовать описанные ранее операторы прерывания цик-

цикла break и возобновления цикла continue.

Следующий цикл будет выполняться бесконечно:

while(true)

{

System.Console.Write("{0} ",i );

Оператор do

Оператор do используется вместе с ключевым словом while. При этом условие за-

завершения цикла проверяется после выполнения его тела:

i = 0;

do

{

System.Console.Write("{0} ",i );

i + +;

} while(i < 10) ;

Оператор foreach

Для обработки таких типов данных, как массивы и контейнеры, язык С# предлагает

очень удобный оператор foreach, для которого нет аналога в языках программиро-

программирования С и C++.

Так как изучение этих типов данных еще впереди, в этой главе мы дадим упрощен-

упрощенное определение массива и приведем простейший пример программы, работающей

с массивами при помощи операторов for и foreach.

Итак, мы будем считать массив набором упорядоченных объектов, каждый из ко-

которых имеет свой номер, или индекс. Первый элемент массива имеет индекс 0, вто-

второй — 1 и т. д.

Массив целых чисел со знаком объявляется следующим образом:

int[] nums;

Пара квадратных скобок указывает на то, что переменная nums является массивом.

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

количество объектов, которые могут в нем храниться. Вот как объявляется и создается

массив переменных типа int:

int[] nums;

nums = new int[10];

Созданный массив инициализируется значениями по умолчанию. Для числовых

массивов в качестве такого значения используется 0.

Чтобы записать в элемент массива с заданным номером какое-либо значение, необ-

необходимо указать индекс этого элемента в квадратных скобках.

Ниже мы в цикле инициализируем массив, записывая в его элементы числа от 0

до 9, причем в нулевой элемент массива записывается значение 0, в первый — значе-

значение 1 и т. д.:

for(i =0; i < 10; i++)

nums[i] = i;

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

цикл for:

for(i = 0; i < 10;

System.Console.Write("{0} ", nums(i]);

Здесь мы последовательно выводим на консоль все значения, хранящиеся в массиве.

Хотя на первый взгляд этот способ обработки всех элементов массива достаточно

прост, ему присущи некоторые недостатки. Например, нам нужно объявлять и ини-

инициализировать переменную цикла (применяемую в роли индекса массива), а затем

увеличивать ее значение при каждой итерации. При этом нужно следить, чтобы значе-

значение переменной цикла не превысило размер массива, иначе возникнет исключение.

Оператором f oreach пользоваться намного проще:

foreach(int current in nums)

System.Console.Write("{0} ", current);

В скобках после ключевого слова f oreach мы объявляем переменную current

типа int, которой при каждой итерации будут последовательно присваиваться все

значения массива nums. Имя этого массива указывается после ключевого слова in.

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

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

массива за допустимые пределы.

Оператор foreach сделает все за нас. Он последовательно присвоит значение

всех элементов массива переменной current, а нам останется только выводить при

каждой итерации значение этой переменной на консоль.

10. Делегаты в языке С#. Объявление и применение (на примере).

делегат — это тип, который определяет подпись метода и его можно связать с любым методом с совместимой подписью. Метод можно запустить (или вызвать) с помощью делегата. Делегаты используются для передачи методов в качестве аргументов к другим методам. Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов. Создание пользовательского метода и класса, например элемента управления Windows, может вызывать метод при возникновении определенного события.

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

Делегаты имеют следующие свойства.

  1. Делегаты похожи на указатели функций в C++, но являются строго типизированными.

  2. Делегаты допускают передачу методов в качестве параметров.

  3. Делегаты можно использовать для задания функций обратного вызова.

  4. Делегаты можно связывать друг с другом; например, несколько методов можно вызвать по одному событию.

  5. Точное соответствие методов подписи делегата не требуется. Дополнительные сведения см. в разделе Covariance and ContravarianceКовариация и контрвариация в делегатах (руководство по программированию в C#).

  6. В C# версии 2.0 представлена концепция анонимных методов, которые позволяют передавать блоки кода в виде параметров вместо использования отдельно определенного метода. В C# 3.0 для краткой записи встроенных блоков кода введены лямбда-выражения. В результате компиляции как анонимных методов, так и лямбда-выражений (в определенном контексте) получаются типы делегатов. В настоящее время эти функции объединяются под одним названием — анонимные функции. Дополнительные сведения о лямбда-выражениях см. в разделе Анонимные функции (Руководство по программированию в C#).

public delegate void Del(string message);

// Create a method for a delegate.

public static void DelegateMethod(string message)

{

System.Console.WriteLine(message);

}

// Instantiate the delegate.

Del handler = DelegateMethod;

// Call the delegate.

handler("Hello World");

Типы делегатов являются производными от класса Delegate в платформе .NET Framework. Типы делегатов являются запечатанными — от них нельзя наследовать, а от Delegate нельзя создавать производные пользовательские классы. Поскольку созданный экземпляр делегата является объектом, его можно передавать как параметр или назначать свойству. Это позволяет методу принимать делегат в качестве параметра и вызывать делегат впоследствии. Эта процедура называется асинхронным обратным вызовом и обычно используется для уведомления вызывающего объекта о завершении длительной операции. Когда делегат используется таким образом, коду, использующему делегат, не требуются сведения о реализации используемого метода. Данные функциональные возможности похожи на возможности, предоставляемые интерфейсами инкапсуляции. Дополнительные сведения см. в разделе