Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
<< На главную

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 212 213 214 215 216 217 218 219 220 ... 642
Перейти на страницу:

Индексаторы являются еще одной формой "синтаксического сахара", учитывая то, что такую же функциональность можно получить с применением "нормальных" открытых методов наподобие AddPerson() или GetPerson(). Тем не менее, поддержка индексаторных методов в специальных типах коллекций обеспечивает хорошую интеграцию с инфраструктурой библиотек базовых классов .NET Core.

Несмотря на то что создание индексаторных методов является вполне обычным явлением при построении специальных коллекций, не забывайте, что обобщенные типы предлагают такую функциональность в готовом виде. В следующем методе используется обобщенный список List&lt;T&gt; объектов Person. Обратите внимание, что индексатор List&lt;T&gt; можно просто применять непосредственно:

using System.Collections.Generic;

static void UseGenericListOfPeople()

{

  List&lt;Person&gt; myPeople = new List&lt;Person&gt;();

  myPeople.Add(new Person(&quot;Lisa&quot;, &quot;Simpson&quot;, 9));

  myPeople.Add(new Person(&quot;Bart&quot;, &quot;Simpson&quot;, 7));

  // Изменить первый объект лица с помощью индексатора.

  myPeople[0] = new Person(&quot;Maggie&quot;, &quot;Simpson&quot;, 2);

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

  for (int i = 0; i &lt; myPeople.Count; i++)

  {

    Console.WriteLine(&quot;Person number: {0}&quot;, i);

    Console.WriteLine(&quot;Name: {0} {1}&quot;,

                       myPeople[i].FirstName, myPeople[i].LastName);

    Console.WriteLine(&quot;Age: {0}&quot;, myPeople[i].Age);

    Console.WriteLine();

  }

}

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

В текущей версии класса PersonCollection определен индексатор, позволяющий вызывающему коду идентифицировать элементы с применением числовых значений. Однако вы должны понимать, что это не требование индексаторного метода. Предположим, что вы предпочитаете хранить объекты Person, используя тип System.Collections.Generic.Dictionary&lt;TKey,TValue&gt;, а не ArrayList. Поскольку типы Dictionary разрешают доступ к содержащимся внутри них элементам с применением ключа (такого как фамилия лица), индексатор можно было бы определить следующим образом:

using System.Collections;

using System.Collections.Generic;

namespace SimpleIndexer

{

  public class PersonCollectionStringIndexer : IEnumerable

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

  {

    private Dictionary&lt;string, Person&gt; listPeople =

        new Dictionary&lt;string, Person&gt;();

    // Этот индексатор возвращает объект лица на основе строкового индекса.

    public Person this[string name]

    {

      get =&gt; (Person)listPeople[name];

      set =&gt; listPeople[name] = value;

    }

    public void ClearPeople()

    {

      listPeople.Clear();

    }

    public int Count =&gt; listPeople.Count;

    IEnumerator IEnumerable.GetEnumerator() =&gt; listPeople.GetEnumerator();

  }

}

Теперь вызывающий код способен взаимодействовать с содержащимися внутри объектами Person:

Console.WriteLine(&quot;***** Fun with Indexers *****n&quot;);

PersonCollectionStringIndexer myPeopleStrings =

  new PersonCollectionStringIndexer();

myPeopleStrings[&quot;Homer&quot;] =

  new Person(&quot;Homer&quot;, &quot;Simpson&quot;, 40);

myPeopleStrings[&quot;Marge&quot;] =

  new Person(&quot;Marge&quot;, &quot;Simpson&quot;, 38);

// Получить объект лица Homer и вывести данные.

Person homer = myPeopleStrings[&quot;Homer&quot;];

Console.ReadLine();

И снова, если бы обобщенный тип Dictionary&lt;TKey, TValue&gt;, напрямую, то функциональность индексаторного метода была бы получена в готовом виде без построения специального необобщенного класса, поддерживающего строковый индексатор. Тем не менее, имейте в виду, что тип данных любого индексатора будет основан на том, как поддерживающий тип коллекции позволяет вызывающему коду извлекать элементы.

Перегрузка индексаторных методов

Индексаторные методы могут быть перегружены в отдельном классе или структуре. Таким образом, если имеет смысл предоставить вызывающему коду возможность доступа к элементам с применением числового индекса или строкового значения, то в одном типе можно определить несколько индексаторов. Например, в ADO.NET (встроенный API-интерфейс .NET для доступа к базам данных) класс DataSet поддерживает свойство по имени Tables, которое возвращает строго типизированную коллекцию DataTableCollection. В свою очередь тип DataTableCollection определяет три индексатора для получения и установки объектов DataTable — по порядковой позиции, по дружественному строковому имени и по строковому имени с дополнительным пространством имен:

1 ... 212 213 214 215 216 217 218 219 220 ... 642
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга