Когда же применение индексаторов наиболее оправданно? Начну с уже приведенного примера окна со списком. С концептуальной точки зрения, такое окно представляет собой просто список, или массив строк, подлежащих выводу. В следующем примере я объявил класс с именем
MyListBox,
содержащий индексатор для установки и получения строк через объект
ArrayList
(класс
Array List
является классом .NET Framework, который используется для хранения совокупности объектов).
using System;
class MyListBox {
protected ArrayList data = new ArrayListQ;
public object this[int idx] {
get {
if (idx > -1 && idx < data.Count) {
return (data[idxj); }
else {
// Здесь возможно возникновение исключения, return null; } }
set {
if (idx > -1 && idx < data.Count) {
datafidx] = value; >
else if (idx == data.Count) {
data.Add(value);
}
else
{
// Здесь возможно возникновение исключения.
} > } }
class IndexerslApp
{
public static void Main()
{
MyListBox Ibx = new MyListBoxQ;
lbx[0] = "foo";
lbx[1] = "bar";
lbx[2] = "baz";
Console.WriteLine("{0} {1} {2}",
lbx[0], lbx[1], lbx[2]);
} >
В этом примере я реализовал проверку на ошибки, возникающие при выходе индекса за границы. Формально это не связано с индексаторами, поскольку индексаторы связаны лишь со способом использования объекта как массива клиентом класса, и никак — с внутренним представлением данных. Однако при изучении функций нового языка это помогает понять не только их синтаксис, но и принципы практического использования. Итак, в обоих методах индексатора (получателе и установщике) я проверял передаваемое значение индекса с помощью данных, хранимых членом класса
ArrayList.
Лично я выбрал бы генерацию исключений в тех случаях, когда переданное значение индекса не может быть использовано. Но это дело вкуса — ваша обработка ошибок может отличаться. Важно дать знать клиенту о возникновении ошибки, когда передается неверный индекс.