C# - Индексаторы: Пособие для начинающих

Здравствуйте,野心勃勃的程序设计师们! Сегодня мы отправимся в увлекательное путешествие в мир индексаторов C#. Не волнуйтесь, если вы новички в программировании - я буду вашим доброжелательным проводником, объясняя все шаг за шагом. Так что, погружаемся!

C# - Indexers

Что такое индексаторы?

Представьте себе книжную полку. Вместо того чтобы перебирать каждую книгу, чтобы найти ту, которую вы хотите, не было бы замечательно просто сказать "Дай мне третью книгу" или "Дай мне книгу с названием 'C# для начинающих' "? Именно это и делают индексаторы в C# - они предоставляют удобный способ доступа к элементам в классе, представляющем коллекцию значений.

Синтаксис индексаторов

Давайте начнем с базового синтаксиса индексатора:

public Type this[Type index]
{
get { /* верните значение */ }
set { /* установите значение */ }
}

Не пугайтесь! Давайте разберем это:

  • public: Это означает, что к индексатору можно получить доступ из خارج класса.
  • Type: Это тип значения, которое будет возвращать или устанавливать индексатор.
  • this: Этот ключевой столбец используется для определения индексатора.
  • [Type index]: Это specifies тип и имя параметра индекса.
  • get и set: Это методы доступа, которые получают или устанавливают значение.

Использование индексаторов

Теперь давайте посмотрим, как работают индексаторы, на простом примере:

public class Bookshelf
{
private string[] books = new string[5];

public string this[int index]
{
get { return books[index]; }
set { books[index] = value; }
}
}

В этом примере мы создали класс Bookshelf с индексатором. Вот как мы можем использовать его:

Bookshelf myShelf = new Bookshelf();
myShelf[0] = "C# для начинающих";
myShelf[1] = "Продвинутый C#";

Console.WriteLine(myShelf[0]); // Выводит: C# для начинающих

Не правда ли, это замечательно? Мы можем доступа и изменять книги так же, как и с массивом, но мы на самом деле работаем с пользовательским классом!

Why Use Indexers?

Вы можете задаваться вопросом: "Why not just use an array?" Ну, индексаторы дают нам больше контроля. Мы можем добавлять валидацию, логирование или любую пользовательскую логику при получении или установке значений. Например:

public string this[int index]
{
get
{
if (index < 0 || index >= books.Length)
throw new IndexOutOfRangeException("Invalid book index!");
return books[index];
}
set
{
if (index < 0 || index >= books.Length)
throw new IndexOutOfRangeException("Invalid book index!");
books[index] = value;
}
}

Теперь, если кто-то попытается доступа к книге, которая не существует, они получат полезное сообщение об ошибке вместо того, чтобы аварийно завершить работу программы!

Переопределенные индексаторы

Как и методы, индексаторы могут быть переопределены. Это означает, что мы можем иметь несколько индексаторов с различными типами параметров. Давайте расширяем наш пример Bookshelf:

public class Bookshelf
{
private string[] books = new string[5];

// Индексатор с параметром int
public string this[int index]
{
get { return books[index]; }
set { books[index] = value; }
}

// Индексатор с параметром string
public string this[string title]
{
get
{
return Array.Find(books, book => book == title);
}
set
{
int index = Array.FindIndex(books, book => book == title);
if (index >= 0)
books[index] = value;
}
}
}

Теперь мы можем доступа к книгам по индексу или названию:

Bookshelf myShelf = new Bookshelf();
myShelf[0] = "C# для начинающих";
myShelf[1] = "Продвинутый C#";

Console.WriteLine(myShelf[0]); // Выводит: C# для начинающих
Console.WriteLine(myShelf["Продвинутый C#"]); // Выводит: Продвинутый C#

myShelf["C# для начинающих"] = "Мастерство C#";
Console.WriteLine(myShelf[0]); // Выводит: Мастерство C#

Не правда ли, это мощно? Теперь мы можем взаимодействовать с нашим Bookshelf несколькими интуитивно понятными способами!

Таблица методов индексаторов

Вотquick reference table των методов индексаторов, которые мы рассмотрели:

Метод Описание Пример
get Получает значение по указанному индексу return books[index];
set У устанавливаает значение по указанному индексу books[index] = value;

Заключение

И вот мы и рассмотрели мир индексаторов C#, от базового синтаксиса до переопределенных индексаторов. Запомните, индексаторы - это мощные инструменты, которые могут сделать ваш код более интуитивно понятным и легким для использования. Они resemble magic spells that transform your classes into easy-to-use collections.

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

Credits: Image by storyset