我想更多地使用索引器,但我不确定什么时候应该使用它们。 在线上我找到的所有例子都使用像 MyClass
和 IndexerClass
这样的类。
在学校系统中,例如有学生和教师,并且每个教师都有一个学生列表,他们负责管理 - 在这种情况下是否需要索引器? 为简单起见:每个学生只能属于一个教师。
索引器(Indexer)是一种高度专业化的属性,它允许类(或结构)的实例像数组一样进行索引操作(属性可以是静态的,但索引器不行)。
为什么要使用索引器:
何时使用索引器:
示例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"};
例子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;
}
}
}
这是我制作的视频:http://www.youtube.com/watch?v=HdtEQqu0yOY,以下是关于该视频的详细说明。
索引器可以使用简化的接口访问类中包含的集合。它是一种语法糖。
例如,假设您有一个客户类,其中包含地址集合。现在假设我们想通过“邮政编码”和“电话号码”获取地址集合。那么逻辑上的步骤就是创建两个重载函数,一个通过“电话号码”获取,另一个通过“邮政编码”获取。如下面的代码所示,我们定义了两个函数。
Customer Customers = new Customer();
Customers.getAddress(1001);
Customers.getAddress("9090");
如果您使用索引器,可以使用下面的代码来简化上面的代码。Customer Customers = new Customer();
Address o = Customers[10001];
o = Customers["4320948"];
干杯。
public class TeachersClass
{
private List<Student> _students;
public TeachersClass(Teacher currentTeacher, List<Student> students)
{
CurrentTeacher = currentTeacher;
_students = students;
}
public Teacher CurrentTeacher { get; set; }
public Student this[int studentID]
{
get
{
return (from s in _students
where s.Id = studentID
select s).First();
}
}
}
如果一个类代表了一组对象的列表、集合或数组,通常会使用索引器。在您的情况下,您可以提供一个索引器来提供对教师学生的基于索引的访问。
随机访问
如果您的数据通常按顺序访问,则可以使用枚举器。
另一方面,索引器可用于直接访问特定元素,无需特定顺序。
当然,这假设您知道要访问的元素的索引。例如,组合框始终支持两个值:向用户显示的字符串和与之相关的 ID。您可以使用组合框中所选项目的 ID 直接访问集合的索引,而无需搜索集合。
C# 中索引器的好处在于您可以对其进行重载,因此可以通过不同类型的键访问项目。
protected int this[int index]
{
get
{
int tempN = Number;
if (index > 0)
{
tempN /= index * 10;
}
return tempN % 10;
}
}
它被保护是因为另一种方法使用了它,所以它有点像一个辅助工具。当然,一个简单的 GetDigit(int a) 也可以达到同样的效果(并且更容易理解),但当时我认为使用索引器是少数几次合理的选择之一。自那以后就没有再使用过 =(。
public Student this[int index] { ..
与其输入
temperature = coorsLight.CalculateFutureTemperature(time);
你可以将这个压缩成
temperature = coorsLight[time];
// C#: INDEXER
using System;
using System.Collections;
class MyClass
{
private string []data = new string[5];
public string this [int index]
{
get
{
return data[index];
}
set
{
data[index] = value;
}
}
}
class MyClient
{
public static void Main()
{
MyClass mc = new MyClass();
mc[0] = "Rajesh";
mc[1] = "A3-126";
mc[2] = "Snehadara";
mc[3] = "Irla";
mc[4] = "Mumbai";
Console.WriteLine("{0},{1},{2},{3},{4}",mc[0],mc[1],mc[2],mc[3],mc[4]);
}
}
{{链接1:代码项目}}
在我看来,如果你想要改进一个打包的 API,索引器可能是最好的选择 - 对于普通的业务对象而言,这并不值得花费精力。
如果你正在创建一些专门的集合,我会将其归类为改进打包的 API - 即使你将所有内容都放在一个模块中。