C# 索引器 Indexers

索引器是一种特殊类型的属性,它允许像访问内部集合的数组一样访问类或结构。 C# 允许我们定义自定义索引器、通用索引器以及重载索引器。 索引器的定义方式与使用this关键字和方括号 [] 的属性相同。

<返回类型> this[参数类型 index]
{
    get{
        //返回内部集合的索引的值
    }
    set{
      //在内部集合中的指定索引处设置值 
    }
}

看一下我们的例子

public class MyFloatList
{
    // List<float> 是泛型类型,下一篇会介绍到
    private List<float> list = new List<float>(4) { 1, 2, 3, 4 };

    public float this[int index]
    {
        get
        {
            if (index > list.Count)
            {
                throw new ArgumentOutOfRangeException(nameof(index), $"索引值{index}超出范围,应小于最大值{list.Count}");
            }
            return list[index];
        }
        set
        {
            if (index > list.Count)
            {
                throw new ArgumentOutOfRangeException(nameof(index), $"索引值{index}超出范围,应小于最大值{list.Count}");
            }
            list[index] = value;
        }
    }
}

上面的 MyFloatList 类为其私有字段List定义了一个索引器。 所以现在,您可以像使用List一样使用 MyFloatList 对 list 进行操作,如下所示。

class Program
{
    static void Main(string[] args)
    {
        var my = new MyFloatList();
        my[0] = 1;
        my[1] = 2;
        my[2] = 3;
        my[3] = 4;
        //my[5] = 100; //索引超出范围了会抛出我们自定义的异常
        for (int i = 0; i < 4; i++)
        {
            Console.Write(my[i] + ",");
        }
    }
}

输出

1,2,3,4,

从 C# 7 开始,您可以将表达式主体(expression-bodied syntax)语法用于 get 和 set。

public class MyFloatList
{
    private List<float> list = new List<float>(4) { 1, 2, 3, 4 };

    public float this[int index]
    {
        get => list[index];
        set => list[index] = value;
    }
}

泛型索引器 索引器也可以是泛型的。 以下通用类包括泛型索引器。

public class MyFloatList<T>
{
    private List<T> list = new List<T>(4) { default, default, default, default };

    public T this[int index]
    {
        get => list[index];
        set => list[index] = value;
    }
}

使用上面的泛型类

static void Main(string[] args)
{
    var my = new MyFloatList<int>();
    my[0] = 1;
    my[1] = 2;
    my[2] = 3;
    my[3] = 4;
    for (int i = 0; i < 4; i++)
    {
        Console.Write(my[i] + ",");
    }
}

输出

1,2,3,4,

索引器重载 Overload Indexer

您可以使用索引的不同数据类型进行重载。 以下示例使用 int 类型索引和字符串类型索引重载索引器。

public class MyFloatList<T>
{
    private List<T> list = new List<T>(4) { default, default, default, default };

    public T this[int index]
    {
        get => list[index];
        set => list[index] = value;
    }

    public T this[string index]
    {
        get
        {
            var i = Convert.ToInt32(index);
            return list[i];
        }
        set
        {
            var i = Convert.ToInt32(index);
            list[i] = value;
        }
    }
}

使用上面定义的泛型类,并且使用string索引器来获取值

class Program
{
    static void Main(string[] args)
    {
        var my = new MyFloatList<int>();
        my[0] = 1;
        my[1] = 2;
        my[2] = 3;
        my[3] = 4;
        for (int i = 0; i < 4; i++)
        {
            //注意这边是string了
            Console.Write(my[i.ToString()] + ",");
        }
    }
}
下一篇:C# 泛型 generic
最近更新的
...