ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Охарактеризуйте використання ітераційних циклів у Visual Basic.

Ітератор можна використовувати для проходу по колекції, такий як список і масив.

Метод ітератора або метод доступу get виконує настроюється прохід по колекції. Метод ітератора використовує оператор Yield (Visual Basic) або yield return (C #) для почергового повернення кожного елемента. При досягненні оператора Yield або yield return поточне розташування в коді запам'ятовується. При наступному виклику функції ітератора виконання поновлюється з того місця.

Використовується ітератор з клієнтського коду за допомогою виписки For Each ... Next (Visual Basic) або foreach (C- #) або за допомогою запиту LINQ.

У наступному прикладі, перший ітерація циклу For Each або foreach призведе до виклику методу ітератора SomeNumbers поки не досягне вираження Yield або yield return. Ця ітерація повертає значення 3, і зберігається поточне розташування в методі ітератора. На наступній ітерації циклу, виконання методу ітератора відновлюється, і знову призупиняється при досягненні оператора Yield або yield return. Ця ітерація повертає значення 5, а поточне розташування в методі ітератора знову зберігаються. Цикл завершується при досягненні кінця методу ітератора.

C # VB

 

static void Main ()

{foreach (int number in SomeNumbers ())

{Console.Write (number.ToString () + "");}

// Output: 3 5 8

Console.ReadKey ();}

public static System.Collections.IEnumerable SomeNumbers ()

{yield return 3; yield return 5; yield return 8; }

Тип значення методу ітератора або методу доступу get може бути IEnumerable, IEnumerable <T>, IEnumerator або IEnumerator <T>.

Можна використовувати оператор C # Exit Function або Return (Visual Basic) або оператор yield break, щоб завершити ітерацію.

Функція ітератора Visual Basic або оголошення методу доступу get включає в себе модифікатор Iterator.

Ітератори були введені в C # в Visual Studio 2005 і з'явилися в Visual Basic в Visual Studio 2012.

Зміст розділу

Простий итератор

Створення класу колекції

Блоки "Try" в Visual Basic

Анонімні методи в Visual Basic

Використання ітераторів з універсальним списком

Відомості про синтаксисі

Технічна реалізація

Використання ітераторів

Простий итератор

У наступному прикладі є оператор Yield або yield return, який знаходиться всередині циклу For ... Next (Visual Basic) або For (C #). У Main кожна ітерація оператора For Each або foreach створює виклик функції ітератора, яка виконує наступний оператор Yield або yield return.

C # VB

static void Main ()

{foreach (int number in EvenSequence (5, 18))

{Console.Write (number.ToString () + "");}

// Output: 6 8 10 12 14 16 18

Console.ReadKey ();}

public static System.Collections.Generic.IEnumerable <int>

EvenSequence (int firstNumber, int lastNumber)

{// Yield even numbers in the range.

for (int number = firstNumber; number <= lastNumber; number ++)

{if (number% 2 == 0)

{yield return number; }}}

Створення класу колекції

Примітка Примітка

Для решти прикладів у цьому розділі додайте оператори Imports (Visual Basic) або директиви C # using для просторів імен System.Collections і System.Collections.Generic.

У наступному прикладі клас DaysOfTheWeek реалізує інтерфейс IEnumerable, який вимагає методу GetEnumerator. Компілятор неявно викликає метод GetEnumerator, який повертає IEnumerator.

Метод GetEnumerator повертає кожен рядок по черзі за допомогою оператора Yield або yield return. У коді Visual Basic, модифікатор Iterator знаходиться в оголошенні функції.

C # VB

static void Main ()

{DaysOfTheWeek days = new DaysOfTheWeek ();

foreach (string day in days)

{Console.Write (day + "");}

// Output: Sun Mon Tue Wed Thu Fri Sat

Console.ReadKey ();}

public class DaysOfTheWeek: IEnumerable

{private string [] days = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

public IEnumerator GetEnumerator ()

{for (int index = 0; index <days.Length; index ++)

{// Yield each day of the week.

yield return days [index]; }}

У наступному прикладі створюється клас Zoo, що містить колекцію тварин.

Оператор For Each або foreach, який звертається до примірника класу (theZoo), неявно викликає метод GetEnumerator. Оператори For Each або foreach, які звертаються до властивостей Birds і Mammals, використовують метод ітератора з ім'ям AnimalsForType.

C # VB

static void Main ()

{Zoo theZoo = new Zoo ();

theZoo.AddMammal ("Whale");

theZoo.AddMammal ("Rhinoceros");

theZoo.AddBird ("Penguin");

theZoo.AddBird ("Warbler");

foreach (string name in theZoo)

{Console.Write (name + "");}

Console.WriteLine ();

// Output: Whale Rhinoceros Penguin Warbler

foreach (string name in theZoo.Birds)

{Console.Write (name + "");}

Console.WriteLine ();

// Output: Penguin Warbler

foreach (string name in theZoo.Mammals)

{Console.Write (name + "");}

Console.WriteLine ();

// Output: Whale Rhinoceros

Console.ReadKey ();}

public class Zoo: IEnumerable

{// Private members.private List <Animal> animals = new List <Animal> ();

// Public methods.

public void AddMammal (string name)

{animals.Add (new Animal {Name = name, Type = Animal.TypeEnum.Mammal});}

public void AddBird (string name)

{animals.Add (new Animal {Name = name, Type = Animal.TypeEnum.Bird});}

public IEnumerator GetEnumerator ()

{foreach (Animal theAnimal in animals)

{yield return theAnimal.Name; }}

// Public members.

public IEnumerable Mammals

{get {return AnimalsForType (Animal.TypeEnum.Mammal); }}

public IEnumerable Birds

{get {return AnimalsForType (Animal.TypeEnum.Bird); }}

// Private methods.

private IEnumerable AnimalsForType (Animal.TypeEnum type)

{foreach (Animal theAnimal in animals)

{if (theAnimal.Type == type)

{yield return theAnimal.Name; }

// Private class.

private class Animal

{public enum TypeEnum {Bird, Mammal}

public string Name {get; set; }

public TypeEnum Type {get; set; }

Блоки "Try" в Visual Basic

Visual Basic допускає оператор Yield в блоці TryОператор Try ... Catch ... Finally (Visual Basic). Блок Try, що має оператор Yield, може містити блоки Catch і блок Finally.

Примітка C # Примітка C #

C # допускає оператор yield return в блоці try оператора try-finally. Блок try, що має оператор yield return, не може мати блоків catch.

Оператор Yield не може бути всередині блоку Catch або блоку Finally.

Якщо вміст в For Each (замість методу ітератора) викликає виключення, то блок Catch у функції ітератора не виконується, але виконується блок Finally у функції ітератора. Блок Catch усередині функції ітератора перехоплює тільки виключення, що відбуваються всередині функції ітератора.

Якщо замість цього перевірка знаходиться всередині функції ітератора, то цю перевірку неможливо виконати до початку першої ітерації For Each.

Використання ітераторів з універсальним списком

У наступному прикладі універсальний клас Stack (Of T) реалізує інтерфейс IEnumerable <T>. Метод Push привласнює значення масиву типу T. Метод GetEnumerator повертає значення масиву за допомогою оператора Yield або yield return.

На додаток до універсального методу GetEnumerator, що не універсальний метод GetEnumerator також повинен бути реалізований. Це відбувається тому, що IEnumerable <T> успадковується від IEnumerable. Чи не універсальна реалізація підпорядковується універсальної реалізації.

У цьому прикладі використовуються іменовані ітератори для підтримки різних способів ітерації по одній і тій же колекції даних. Ці іменовані ітератори є властивостями TopToBottom і BottomToTop, і методом TopN.

Властивість BottomToTop використовує итератор в методі доступу get. У коді Visual Basic оголошення властивості містить ключове слово Iterator.

Відомості про синтаксис

Ітератор може відбуватися як метод або метод доступу get. Ітератор не може відбутися в подію, конструкторі примірника, статичному конструкторі або статичному деструкторі.

Має існувати неявне перетворення з виразу типу в операторі C # Yield (Visual Basic) або yield return до що повертається типом ітератора.

У Visual Basic методи з модифікатором Iterator не можуть мати параметри ByRef. У C # методи з модифікатором Iterator не можуть мати параметри ref або out.

У Visual Basic "Yield" не є зарезервованим словом і має спеціальне значення, тільки якщо він використовується в методі Iterator або методі доступу get. У C #, "yield" не є зарезервованим словом і має спеціальне значення, тільки якщо він використовується перед ключовим словом return або break.

Технічна реалізація

Хоча итератор створюється як метод, компілятор переводить його у вкладений клас, який фактично є кінцевим автоматом. Даний клас відстежує положення ітератора, поки в клієнтському коді виконується цикл For Each ... Next або foreach.

Щоб переглянути операції компілятора, скористайтеся засобом Ildasm.exe для відображення коду проміжного мови Microsoft, створюваного для методу ітератора.

При створенні ітератора для класу або структури реалізація всього інтерфейсу IEnumerator не потрібно. Коли компілятор виявляє ітератор, він автоматично створює методи Current, MoveNext і Dispose інтерфейсу IEnumerator або IEnumerator <T>.

На кожній послідовної ітерації циклу For Each ... Next або foreach (або безпосереднього виклику методу IEnumerator.MoveNext) код тіла наступного ітератора починає виконання після попереднього оператора Yield або yield return. Потім він виконується до наступного оператора Yield або yield return доти, поки не буде досягнутий кінець тіла ітератора або поки не буде виявлений оператор Visual Basic Exit Function або Return, або оператор C # yield break.

Ітератори не підтримують метод IEnumerator.Reset. Для повторної ітерації спочатку необхідно отримати новий ітератор.

Додаткові відомості див. У Специфікація мови Visual Basic або в Специфікація мови C #.

Використання ітераторів

Ітератори дозволяють підтримувати простоту циклу For Each, коли необхідно використовувати складний код, щоб заповнити послідовність списків. Це може виявитися корисним при:

Зміні послідовності списків після першої ітерації циклу For Each.

Уникнення повного завантаження великого списку перед першою итерацией циклу For Each. Наприклад, посторінкова завантаження пакету рядків таблиці. Інший приклад - метод EnumerateFiles, який реалізує ітератори в платформі .NET Framework.

Инкапсулирование побудови списку в ітератором. У методі ітератора можна побудувати список, а потім видавати кожен результат в циклі.

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти