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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 211 212 213 214 215 216 217 218 219 ... 642

Затем будут обсуждаться темы, которые особенно полезны при работе с API-интерфейсами LINQ (хотя они применимы и за рамками контекста LINQ): расширяющие методы и анонимные типы.

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

Понятие индексаторных методов

Программистам хорошо знаком процесс доступа к индивидуальным элементам, содержащимся внутри простого массива, с применением операции индекса ([]). Вот пример:

// Организовать цикл по аргументам командной строки

// с использованием операции индекса.

for(int i = 0; i < args.Length; i++)

{

  Console.WriteLine("Args: {0}", args[i]);

}

// Объявить массив локальных целочисленных значений.

int[] myInts = { 10, 9, 100, 432, 9874};

// Применить операцию индекса для доступа к каждому элементу.

for(int j = 0; j < myInts.Length; j++)

{

  Console.WriteLine("Index {0}  = {1} ", j,  myInts[j]);

}

Console.ReadLine();

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

Прежде чем выяснять, каким образом реализуется специальный индексатор, давайте начнем с того, что  продемонстрируем его в действии. Пусть к специальному типу PersonCollection, разработанному в главе 10 (в проекте IssuesWithNonGenericCollections), добавлена поддержка индексаторного метода. Хотя сам индексатор пока не добавлен, давайте посмотрим, как он используется внутри нового проекта консольного приложения по имени SimpleIndexer:

using System;

using System.Collections.Generic;

using System.Data;

using SimpleIndexer;

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

Console.WriteLine("***** Fun with Indexers *****n");

PersonCollection myPeople = new PersonCollection();

<b>// Добавить объекты с применением синтаксиса индексатора.</b>

myPeople[0] = new Person(&quot;Homer&quot;, &quot;Simpson&quot;, 40);

myPeople[1] = new Person(&quot;Marge&quot;, &quot;Simpson&quot;, 38);

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

myPeople[2] = new Person(&quot;Lisa&quot;, &quot;Simpson&quot;, 9);

myPeople[3] = new Person(&quot;Bart&quot;, &quot;Simpson&quot;, 7);

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

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

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 (или любой другой класс либо структуру) для поддержки такой функциональности? Индексатор представлен как слегка видоизмененное определение свойства С#. В своей простейшей форме индексатор создается с применением синтаксиса this[]. Ниже показано необходимое обновление класса PersonCollection:

using System.Collections;

namespace SimpleIndexer

{

  // Добавить индексатор к существующему определению класса.

  public class PersonCollection : IEnumerable

  {

    private ArrayList arPeople = new ArrayList();

    ...

    // Специальный индексатор для этого класса.

    public Person this[int index]

    {

      get =&gt; (Person)arPeople[index];

      set =&gt; arPeople.Insert(index, value);

    }

  }

}

Если не считать факт использования ключевого слова this с квадратными скобками, то индексатор похож на объявление любого другого свойства С#. Например, роль области get заключается в возвращении корректного объекта вызывающему коду. Здесь мы достигаем цели делегированием запроса к индексатору объекта ArrayList, т.к. данный класс также поддерживает индексатор. Область set контролирует добавление новых объектов Person, что достигается вызовом метода Insert() объекта ArrayList.

1 ... 211 212 213 214 215 216 217 218 219 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий