我想更多地使用索引器,但我不确定何时使用它们。我在网上找到的所有内容都是使用MyClass
和IndexerClass
等类的示例。
在有学生和教师的学校系统中,每个教师都有一份他们负责的学生名单 - 在这种情况下是否需要索引者?为简单起见,每个学生只能属于一位教师。
答案 0 :(得分:7)
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, 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;
}
}
}
答案 1 :(得分:6)
下面是我创建的视频http://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"];
干杯。
答案 2 :(得分:3)
如果类表示对象的列表,集合或数组,则通常使用索引器。在您的情况下,您可以提供一个索引器来为教师的学生提供基于索引的访问。
答案 3 :(得分:3)
随机订单访问
如果您的数据通常是按顺序访问的,那么您将使用枚举器。
另一方面,索引器对于直接访问特定元素非常有用,没有特定的顺序。
这当然假设您知道所需元素的索引。例如,组合框始终支持两个值:向用户显示的字符串以及属于它的id。您可以使用组合框中所选项目的ID直接访问集合的索引,而不必搜索集合。
C#中索引器的优点是你可以重载它们,所以你可以通过不同类型的键访问项目。
答案 4 :(得分:1)
简单的答案(如上所述)是当类表示/包含项集合时,索引器将返回集合的元素。
public Student this[int index] { ..
在更高级的情况下,您可以使用类创建默认行为,并使其看起来有点像委托,尤其是当类表示映射或进程时。例如,计算冰箱中啤酒冷却速度的类别:
而不是输入
temperature = coorsLight.CalculateFutureTemperature(time);
你可以相信
temperature = coorsLight[time];
如果类的预期行为(和意图)是返回值。
答案 5 :(得分:1)
索引器是一种从聚合中选择元素的方法,例如数组或集合。虽然我同意Ian Davis的观点,但我认为索引者代表的不仅仅是公共API抛光。
索引器是访问数组的主要方法,而大多数主要类代表.NET BCL实现的索引器中的集合,可能是为了在处理聚合其他类型的类型时提供一个共同的经验。
因为索引器是许多BCL集合类型的接口的标准部分,并且因为这些类型被大量使用,因此开发人员将.NET学习为平台,所以建议创建集合可以期望的是合理的。使用某种类型的索引器访问。
如果您的类型的界面符合开发人员已经拥有的期望,那么该类型变得更容易使用,因为开发人员不必考虑。无论相关开发人员是您的组织内部还是外部开发人员,都是如此。
当然,有些情况下,索引器只是没有意义,如果是这样,那么就不要实现索引器。
答案 6 :(得分:0)
恕我直言,如果你试图修改一个打包的API,索引器可能是最好的 - 你的工厂业务对象的运行是不值得的。
如果您正在制作一些专门的收藏品,我会将其归类为修改您的打包API - 即使您将其全部保存在一个模块中。
答案 7 :(得分:0)
在您的情境中使用索引器将是一个TeachersClass类,它将封装学生(集合)和当前教师。虽然您可以通过公开学生列表来做同样的事情,但它确实向您展示了一个例子。
这是一个代码示例:
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();
}
}
}
答案 8 :(得分:0)
索引器允许对类或结构的实例进行索引,就像数组一样。索引器类似于属性,除了它们的访问器接受参数。
索引器使对象能够以与数组类似的方式编制索引。
// 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]);
}
}
答案 9 :(得分:0)
我记得有一次,当我在课堂上有一个很长的时间,而那个特定长的一些数字意味着某些东西(例如,如果第三个数字是3则意味着图表具有特定类型的编码,可怕的系统我知道,但我没有发明它)
所以我做了这样的事情来返回数字的第x位:
protected int this[int index]
{
get
{
int tempN = Number;
if (index > 0)
{
tempN /= index * 10;
}
return tempN % 10;
}
}
它受到保护,因为使用了不同的方法,所以它是一种帮助。当然,一个简单的GetDigit(int a)将是同样的事情(并且更加不言自明)但当时我认为这是我认为使用索引器的少数几次之一是有意义的。从未使用过它们=(。