什么时候应该使用C#索引器?

我想更多地使用索引器,但我不确定何时使用它们。 我在网上找到的都是使用MyClassIndexerClass等类的例子。

在有学生和教师的学校系统中,每个教师都有一份他们负责的学生名单 – 在这种情况下是否需要索引者? 为简单起见:每个学生只能属于一位教师。

下面是我创建的videohttp://www.youtube.com/watch?v=HdtEQqu0yOY ,下面是对此相关的详细说明。

索引器有助于使用简化的界面在类中访问包含的集合。 这是一种语法糖。

例如,假设您有一个带有地址集合的客户类。 现在让我们说我们想要通过“Pincode”和“PhoneNumber”来获取地址集合。 因此,逻辑步骤是你将创建两个重载函数,一个使用“PhoneNumber”获取,另一个通过“PinCode”获取。 您可以在下面的代码中看到我们定义了两个函数。

 Customer Customers = new Customer(); Customers.getAddress(1001); Customers.getAddress("9090"); 

如果您使用索引器,您可以使用以下代码中显示的内容简化上述代码。

 Customer Customers = new Customer(); Address o = Customers[10001]; o = Customers["4320948"]; 

干杯。

如果类表示对象的列表,集合或数组,则通常使用索引器。 在您的情况下,您可以提供一个索引器来为教师的学生提供基于索引的访问。

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"}; 

例2:

 class TempratureRecord{ private float[] temps = new float[10] { 56.2F, 56.7F, 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; } } } 

随机订单访问

如果通常按顺序访问数据,则可以使用枚举器。

另一方面,索引器对于直接访问特定元素非常有用,没有特定的顺序。

这当然假设您知道所需元素的索引。 例如,combobox始终支持两个值:显示给用户的字符串,以及属于它的id。 您可以使用combobox中所选项目的ID直接访问集合的索引,而不必搜索集合。

C#中的索引器的优点是你可以重载它们,所以你可以通过不同类型的键访问项目。

简单的答案(如上所述)是当类表示/包含项集合时,索引器将返回集合的元素。

 public Student this[int index] { .. 

在更高级的情况下,您可以使用类创建默认行为,并使其看起来有点像委托,尤其是当类表示映射或进程时。 例如,计算冰箱中啤酒冷却速度的类:

而不是打字

 temperature = coorsLight.CalculateFutureTemperature(time); 

你可以相信这一点

 temperature = coorsLight[time]; 

如果类的预期行为(和意图)是返回值。

索引器是一种从聚合(例如数组或集合)中选择元素的方法。 虽然我同意Ian Davis的观点,但我认为索引者代表的不仅仅是公共API抛光。

索引器是访问数组的主要方法,而大多数主要类代表.NET BCL实现的索引器中的集合,可能是为了在处理聚合其他类型的类型时提供一个共同的经验。

因为索引器是许多BCL集合类型的接口的标准部分,并且因为这些类型被大量使用,所以当开发人员将.NET学习为平台时,建议创建可以使用集合访问集合的期望是合理的。某种类型的索引器。

如果您的类型的界面符合开发人员已经具有的期望,那么该类型变得更容易使用,因为开发人员不必考虑。 无论相关开发人员是您的组织内部还是外部开发人员,都是如此。

当然,有些情况下,索引器只是没有意义,如果是这样,那么就不要实现索引器。

恕我直言,索引器可能是最好的,如果你试图修改一个打包的API – 它不值得为你的磨机业务对象的运行。

如果你正在制作一些专门的collections品,我会把它归类为修改你的打包API – 即使你把它全部放在一个模块中。

在您的情况下使用索引器将是一个TeachersClass类,它将封装学生(集合)和当前教师。 虽然您可以通过公开学生列表来做同样的事情,但它确实向您展示了一个例子。

这是一个代码示例:

 public class TeachersClass { private List _students; public TeachersClass(Teacher currentTeacher, List 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(); } } } 

索引器允许类或结构的实例像数组一样被索引。 索引器类似于属性,除了它们的访问器接受参数。

索引器使对象能够以与数组类似的方式编制索引。

  // 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]); } } 

代码项目

我记得有一次我在一个class级里面有一个很长的时间,并且那个特定长的一些数字意味着什么(例如,如果第三个数字是3,这意味着图表具有特定类型的编码,我知道可怕的系统但我没有发明它)

所以我做了这样的事情来返回数字的第x位:

 protected int this[int index] { get { int tempN = Number; if (index > 0) { tempN /= index * 10; } return tempN % 10; } } 

它受到保护,因为使用了不同的方法,所以它是一种帮助。 当然,一个简单的GetDigit(int a)会是同样的事情(并且更加不言自明),但当时我认为这是我认为使用索引器的少数几次之一。 从那以后没用过它们((。