Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Затем будут обсуждаться темы, которые особенно полезны при работе с 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
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("Homer", "Simpson", 40);
myPeople[1] = new Person("Marge", "Simpson", 38);
myPeople[2] = new Person("Lisa", "Simpson", 9);
myPeople[3] = new Person("Bart", "Simpson", 7);
myPeople[4] = new Person("Maggie", "Simpson", 2);
<b>// Получить и отобразить элементы, используя индексатор.</b>
for (int i = 0; i < myPeople.Count; i++)
{
Console.WriteLine("Person number: {0}", i); // номер лица
Console.WriteLine("Name: {0} {1}",
myPeople[i].FirstName, myPeople[i].LastName); // имя и фамилия
Console.WriteLine("Age: {0}", 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 => (Person)arPeople[index];
set => arPeople.Insert(index, value);
}
}
}
Если не считать факт использования ключевого слова
this
get
ArrayList
set
Person
Insert()
ArrayList