您的当前位置:首页正文

理解 C# 中的索引器(Indexer)详解与示例

2024-10-31 来源:个人技术集锦


在 C# 中,索引器(Indexer)是一种特殊的属性,允许类的实例像数组一样通过索引访问。索引器使得可以定义类似于数组的访问方式,但是访问的对象可以是类的实例,而不仅限于数组。

1. 索引器的基本概念

索引器允许通过类实例的索引来访问该类的实例成员。它的声明类似于属性,但具有参数。通常情况下,索引器用于允许类的实例像数组一样通过索引进行访问。

2. 索引器的语法

索引器的语法如下所示:

public class MyClass
{
    // 声明一个索引器
    public returnType this[indexType index]
    {
        get
        {
            // 返回索引位置的值
        }
        set
        {
            // 设置索引位置的值
        }
    }
}
  • returnType: 索引器返回的数据类型,可以是任意有效的 C# 数据类型。
  • indexType: 索引的参数类型,可以是整数、字符串或其他合法类型。
  • get: 获取索引位置的值的访问器。
  • set: 设置索引位置的值的访问器。

3、索引器示例

下面通过一个简单的示例来演示如何定义和使用索引器。

3.1. 定义一个简单的索引器

首先,我们定义一个名为MyCollection的类,包含一个私有的数组和一个索引器。

public class MyCollection
{
    private int[] items = new int[10];

    public int this[int index]
    {
        get
        {
            if (index >= 0 && index < items.Length)
            {
                return items[index];
            }
            else
            {
                throw new ArgumentOutOfRangeException("index");
            }
        }
        set
        {
            if (index >= 0 && index < items.Length)
            {
                items[index] = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("index");
            }
        }
    }
}

3.2. 使用索引器

接下来,我们创建MyCollection类的实例,并通过索引器访问和修改内部数组元素。

class Program
{
    static void Main(string[] args)
    {
        MyCollection collection = new MyCollection();

        // 通过索引器设置元素值
        collection[0] = 1;
        collection[1] = 2;
        collection[2] = 3;

        // 通过索引器获取元素值
        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine(collection[i]);
        }
    }
}

运行程序,输出结果如下:

1
2
3

4、索引器进阶

4.1. 多维索引器

C#索引器可以支持多维索引,如下所示:

public class Matrix
{
    private int[,] items = new int[3, 3];

    public int this[int row, int col]
    {
        get
        {
            if (row >= 0 && row < 3 && col >= 0 && col < 3)
            {
                return items[row, col];
            }
            else
            {
                throw new ArgumentOutOfRangeException("row or col");
            }
        }
        set
        {
            if (row >= 0 && row < 3 && col >= 0 && col < 3)
            {
                items[row, col] = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("row or col");
            }
        }
    }
}

4.2. 索引器重载

C#允许对索引器进行重载,如下所示:

public class MyCollection
{
    private int[] items = new int[10];
    private string[] strings = new string[10];

    public int this[int index]
    {
        get
        {
            // ...
        }
        set
        {
            // ...
        }
    }

    public string this[string key]
    {
        get
        {
            // ...
        }
        set
        {
            // ...
        }
    }
}

5. 索引器的注意事项

  • 索引器可以具有多个参数,但每个参数的类型必须唯一。
  • 索引器的参数可以是值类型或引用类型。
  • 可以根据需要只声明 get 或 set 访问器,但至少必须实现其中一个。

6. 总结

索引器是 C# 中一个强大且灵活的特性,允许类的实例像数组一样通过索引来访问。它提供了一种简洁、直观的方式来管理类的实例数据,特别适用于需要按照索引方式进行访问和修改的场景。

通过本文的介绍和示例,希望读者能够理解并掌握 C# 中索引器的使用方法和基本原理,从而能够在实际项目中灵活运用。

Top