C# 索引器

索引器允许我们像使用数组一样,通过索引来访问类的实例。


定义 C# 索引器

在 C# 中,我们使用 `this` 关键字,后跟 `[]` 索引表示法,来定义索引器,就像定义属性一样。例如,

public int this[int index]
{
    get
    {
        return val[index];
    }

    set
    {
        val[index] = value;
    }
}

这里,

  • `public` - 访问修饰符
  • `int` - 索引器的返回类型
  • `this` - 表明我们正在当前类中定义索引器
  • `int index` - 使用整数索引位置访问值
  • `get` - 返回值的“方法”
  • `set` - 赋值的“方法”

示例:C# 索引器

using System;
class Program
{
    // declare an array to store elements  
    private string[] studentName = new string[10];

// define an indexer public string this[int index] { get { // return value of stored at studentName array return studentName[index]; } set { // assigns value to studentName studentName[index] = value; } }
public static void Main() { // create instance of Program class Program obj = new Program(); // insert values in obj[] using indexer i.e index position obj[0] = "Harry"; obj[1] = "Ron"; obj[2] = "Hermoine"; Console.WriteLine("First element in obj: " + obj[0]); Console.WriteLine("Second element in obj: " + obj[1]); } }

输出

First element in obj: Harry
Second element in obj: Ron

在上面的示例中,请注意代码

// declare an array to store elements  
private string[] studentName = new string[10];

这里,我们声明了一个大小为 **10** 的 `studentName` 数组。

然后,我们定义了一个 `string` 类型的索引器。请注意下面的代码,

// define an indexer
public string this[int index]
{
    get
    {
        // return value stored at studentName array  
        return studentName[index];
    }

    set
    {
        // assigns value to studentName  
        studentName[index] = value;
    }
}

在这里,`set` 方法使用 `index` 为 `studentName` 赋值。而 `get` 方法返回存储在 `studentName` 中的值。

请注意以下代码,

// create instance of Program class 
Program obj = new Program();

// insert values in obj[] using indexer i.e index position
obj[0] = "Harry";
obj[1] = "Ron";
obj[2] = "Hermoine";

在这里,我们像使用 `studentName` 数组一样,使用了 `obj`(`Program` 类的实例)。

注意: 不使用索引器,我们通过 `obj` 访问 `studentName` 数组的方式如下:

// insert value to studentName array when indexer is not used 
obj.studentName[0] = "Harry";

索引器有助于简化语法。


C# 中的泛型索引器

在 C# 中,我们也可以在泛型类中使用索引器。例如,

using System;
class EmployeeInfo<T>
{
    // declare an array to store elements  
    private T[] employee = new T[50];

// define an indexer, // T indicates return type of indexer is generic public T this[int index]
{ get { // return value of stored at studentName array return employee[index]; } set { // assigns value to studentName employee[index] = value; } } } class Program { public static void Main() { // create instance of EmployeeInfo class of int type EmployeeInfo<int> Id = new EmployeeInfo<int>(); // insert integer values in Id[] using indexer i.e index position Id[0] = 3; Id[1] = 23; Id[2] = 10; Console.WriteLine("First element in Id object: " + Id[0]); // create instance of EmployeeInfo class of string type EmployeeInfo<string> Name = new EmployeeInfo<string>(); // insert string values in Name[] using indexer i.e index position Name[0] = "Taylor"; Name[1] = "Selena"; Name[2] = "Joe"; Console.WriteLine("First element in Name object: " + Name[0]); } }

输出

First element in Id object: 3
First element in Name object: Taylor

在上面的示例中,请注意代码,

public T this[int index]
{
    get
    {
        // return value of stored at studentName array  
        return employee[index];
    }

    set
    {
        // assigns value to studentName  
        employee[index] = value;
    }
}

这里,我们定义了一个返回类型为 `T` 的索引器,这表明它可以返回任何泛型数据类型。

此外,我们还创建了类型为 `int` 和 `string` 的 `EmployeeInfo` 类的实例。请注意下面的代码,

// create instance of EmployeeInfo class of int type  
EmployeeInfo<int> Id = new EmployeeInfo<int>();

// create instance of EmployeeInfo class of string type 
EmployeeInfo<string> Name = new EmployeeInfo<string>();

在这里,`Id` 和 `Name` 这两个实例被像数组一样使用索引进行访问。请注意下面的代码,

// insert integer values in Id[] using indexer i.e index position
Id[0] = 3;

// insert string values in Name[] using indexer i.e index position
Name[0] = "Taylor";
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战