books-read.com
books-read.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Наш ресурс дает возможность бесплатно читать книгу онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных . Сайт books-read.com дает возможность читать полную версию книги без регистрации и sms. Все книги онлайн, не надо качать fb2, epub, txt.
Добавить книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю в приложение ЧИТАТЬ КНИГУ ОФЛАЙН в приложении ios/android
Перейти на страницу:

using System.Collections;

namespace CustomEnumerator

{

  // Garage содержит набор объектов Car.

  public class Garage

  {

    private Car[] carArray = new Car[4];

    // При запуске заполнить несколькими объектами Car.

    public Garage()

    {

      carArray[0] = new Car("Rusty", 30);

      carArray[1] = new Car("Clunker", 55);

      carArray[2] = new Car("Zippy", 30);

      carArray[3] = new Car("Fred", 30);

    }

  }

}

В идеальном случае было бы удобно проходить по внутренним элементам объекта

Garage
с применением конструкции
foreach
как в ситуации с массивом значений данных:

using System;

using CustomEnumerator;

// Код выглядит корректным...

Console.WriteLine("***** Fun with IEnumerable / IEnumerator *****n");

Garage carLot = new Garage();

// Проход по всем объектам Car в коллекции?

foreach (Car c in carLot)

{

  Console.WriteLine("{0} is going {1} MPH",

    c.PetName, c.CurrentSpeed);

}

Console.ReadLine();

К сожалению, компилятор информирует о том, что в классе Garage не реализован метод по имени

GetEnumerator()
, который формально определен в интерфейсе
IEnumerable
, находящемся в пространстве имен
System.Collections
.

На заметку! В главе 10 вы узнаете о роли обобщений и о пространстве имен

System.Collections.Generic
. Как будет показано, это пространство имен содержит обобщенные версии интерфейсов
IEnumerable/IEnumerator
, которые предлагают более безопасный к типам способ итерации по элементам.

Классы или структуры, которые поддерживают такое поведение, позиционируются как способные предоставлять вызывающему коду доступ к элементам, содержащимся внутри них (в рассматриваемом примере самому ключевому слову

foreach
). Вот определение этого стандартного интерфейса:

// Данный интерфейс информирует вызывающий код о том,

// что элементы объекта могут перечисляться

public interface IEnumerable

{

   IEnumerator GetEnumerator();

}

Как видите, метод

GetEnumerator()
возвращает ссылку на еще один интерфейс по имени
System.Collections.IEnumerator
, обеспечивающий инфраструктуру, которая позволяет вызывающему коду обходить внутренние объекты, содержащиеся в совместимом с
IEnumerable
контейнере:

// Этот интерфейс позволяет вызывающему коду получать элементы контейнера.

public interface IEnumerator

{

   bool MoveNext ();   // Переместить вперед внутреннюю позицию курсора.

   object Current { get;}  // Получить текущий элемент

                           // (свойство только для чтения).

   void Reset (); // Сбросить курсор в позицию перед первым элементом.

}

Если вы хотите обновить тип

Garage
для поддержки этих интерфейсов, то можете пойти длинным путем и реализовать каждый метод вручную. Хотя вы определенно вольны предоставить специализированные версии методов
GetEnumerator()
,
MoveNext()
,
Current
и
Reset()
, существует более легкий путь. Поскольку тип
System.Array
(а также многие другие классы коллекций) уже реализует интерфейсы
IEnumerable
и
IEnumerator
, вы можете просто делегировать запрос к
System.Array
следующим образом (обратите внимание, что в файл кода понадобится импортировать пространство имен
System.Collections
):

using System.Collections;

...

public class Garage : IEnumerable

{

  // System.Array уже реализует IEnumerator!

  private Car[] carArray = new Car[4];

  public Garage()

  {

    carArray[0] = new Car("FeeFee", 200);

    carArray[1] = new Car("Clunker", 90);

    carArray[2] = new Car("Zippy", 30);

    carArray[3] = new Car("Fred", 30);

  }

 // Возвратить IEnumerator объекта массива.

  public IEnumerator GetEnumerator()

    => carArray.GetEnumerator();

}

После такого изменения тип

Garage
можно безопасно использовать внутри конструкции
foreach
. Более того, учитывая, что метод
GetEnumerator()
был определен как открытый, пользователь объекта может также взаимодействовать с типом
IEnumerator
:

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - на сайте онлайн книг books-read.com Вы можете читать полные версии книг автора в одном месте.


Язык программирования C#9 и платформа .NET5 отзывы

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор books-read.com


Прокомментировать
Подтвердите что вы не робот:*