索引器允许一个对象通过使用方括号([])语法来访问其内部的数据。这使得对象可以像数组一样被操作,从而提供了更自然的接口来访问类中的数据。
定义索引器
索引器定义了对象如何通过方括号操作符来访问其元素。它们通常用于实现自定义的集合或数据结构。索引器可以接受一个或多个参数,并且返回一个值。
// www.javascriptcn.com code example
public class MyClass
{
private int[] _data = new int[100];
// 定义一个索引器
public int this[int index]
{
get { return _data[index]; }
set { _data[index] = value; }
}
}在这个例子中,我们创建了一个名为 MyClass 的类,它有一个私有数组 _data 作为存储数据的地方。这个类定义了一个索引器,允许外部代码通过索引器访问和修改 _data 数组中的元素。
使用索引器
索引器可以像数组那样被使用,这使得代码更加直观和易于理解。
var obj = new MyClass(); obj[50] = 100; // 设置索引为50的值为100 int value = obj[50]; // 获取索引为50的值 Console.WriteLine(value); // 输出:100
在这个例子中,我们首先创建了一个 MyClass 类的实例 obj。然后我们通过索引器设置了索引为50的值,并立即获取并打印了该值。
索引器的参数
索引器可以接受一个或多个参数,这些参数可以是任何类型,但通常会是整型或枚举类型。参数的类型决定了索引器的签名,并影响到索引器的调用方式。
// www.javascriptcn.com code example
public class Book
{
private string[] _titles = new string[100];
// 定义一个带参数的索引器
public string this[string author, int index]
{
get { return _titles[index]; }
set { _titles[index] = $"{author}: {value}"; }
}
}
// 使用带参数的索引器
var book = new Book();
book["Author1", 0] = "Book1";
book["Author2", 0] = "Book2";
Console.WriteLine(book["Author1", 0]); // 输出:Author1: Book1
Console.WriteLine(book["Author2", 0]); // 输出:Author2: Book2在这个例子中,我们定义了一个名为 Book 的类,其中包含一个索引器,它接受两个参数:一个字符串类型的作者名和一个整型的索引。这个索引器用于存储和检索书籍信息。
只读索引器
如果索引器只包含 get 访问器,则它被称为只读索引器。这使得索引器只能用于检索数据,而不能修改数据。
// www.javascriptcn.com code example
public class ReadOnlyClass
{
private readonly Dictionary<string, string> _data = new Dictionary<string, string>();
// 定义一个只读索引器
public string this[string key]
{
get { return _data.ContainsKey(key) ? _data[key] : null; }
}
// 添加数据的方法
public void Add(string key, string value)
{
_data[key] = value;
}
}
// 使用只读索引器
var readOnlyObj = new ReadOnlyClass();
readOnlyObj.Add("Key1", "Value1");
readOnlyObj.Add("Key2", "Value2");
Console.WriteLine(readOnlyObj["Key1"]); // 输出:Value1
Console.WriteLine(readOnlyObj["Key2"]); // 输出:Value2在这个例子中,我们定义了一个名为 ReadOnlyClass 的类,它有一个只读索引器。这个索引器只能用于从字典中检索数据。为了能够添加数据到字典中,我们提供了一个 Add 方法。
总结
索引器提供了一种自然的方式来访问和操作对象的数据,使得代码看起来更加简洁和直观。通过定义索引器,我们可以让对象的行为类似于数组或集合,这提高了代码的可读性和可维护性。