我想更多地使用索引器,但我不确定何时使用它们.我在网上找到的都是使用类MyClass和的类的例子IndexerClass.
在有学生和教师的学校系统中,每个教师都有一份他们负责的学生名单 - 在这种情况下是否需要索引者?为简单起见,每个学生只能属于一名教师.
Indexer是一个高度专业化的属性,它允许类(或结构)的实例像数组一样被索引(属性可以是静态的但索引器不能).
为什么要使用索引器:
- 而不是新的数据结构,类本身就是一个数据结构.
- 简化语法 - 句法糖
何时使用:
- 如果您的类需要其实例的列表(/数组)(示例1)
- 如果您的类表示与您的类直接相关的值的列表(/数组)(示例2)
例1:
public class Person{
public string Name{get; set;}
private Person[] _backingStore;
public Person this[int index]
{
get{
return _backingStore[index];
}
set{
_backingStore[index] = value;
}
}
}
Person p = new Person();
p[0] = new Person(){Name = "Hassan"};
p[1] = new Person(){Name = "John Skeet"};
Run Code Online (Sandbox Code Playgroud)
例2:
class TempratureRecord{
private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 61.3F, 56.5F, 56.9F, 58.8F, 61.3F};
public int Length{
get { return temps.Length; }
}
public float this[int index]
{
get{
return temps[index];
}
set{
temps[index] = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
下面是我创建的视频http://www.youtube.com/watch?v=HdtEQqu0yOY,下面是对此相关的详细说明.
索引器有助于使用简化的界面在类中访问包含的集合.这是一种语法糖.
例如,假设您有一个包含地址集合的客户类.现在让我们说我们想要通过"Pincode"和"PhoneNumber"来获取地址集合.因此,逻辑步骤是你将创建两个重载函数,一个使用"PhoneNumber"获取,另一个通过"PinCode"获取.您可以在下面的代码中看到我们定义了两个函数.
Customer Customers = new Customer();
Customers.getAddress(1001);
Customers.getAddress("9090");
Run Code Online (Sandbox Code Playgroud)
如果您使用索引器,则可以使用以下代码中所示的内容简化上述代码.
Customer Customers = new Customer();
Address o = Customers[10001];
o = Customers["4320948"];
Run Code Online (Sandbox Code Playgroud)
干杯.