【发布时间】:2014-09-20 14:15:38
【问题描述】:
我在MSDN - Indexers 中读到了关于索引器的内容,它解释了我们如何使用带有索引的数组之类的对象,即就像普通数组一样。但是,我认为我们可以创建对象数组,例如
point[] array = new point[100];
那么Indexer相对于对象数组的特殊优势是什么?
【问题讨论】:
我在MSDN - Indexers 中读到了关于索引器的内容,它解释了我们如何使用带有索引的数组之类的对象,即就像普通数组一样。但是,我认为我们可以创建对象数组,例如
point[] array = new point[100];
那么Indexer相对于对象数组的特殊优势是什么?
【问题讨论】:
如果您所追求的只是对象的集合,那么索引器绝对没有数组的优势。但是,如果您需要存储状态和集合,那就是索引器的亮点。
例如,考虑以下情况
public class Tree
{
private Branch[] branches = new Branch[100];
...
public string Name { get; set; }
public Branch this[int i]
{
get
{
return branches[i];
}
}
}
Tree 拥有一个内部集合,但也有它自己的状态。拥有 indexer 属性可以简单地访问底层集合,例如
tree.Name = "Tree";
var branch = tree[0];
【讨论】:
在你上面提到的这种情况下不是。但是,如果您有任何不能表示为数组的东西,那么将是使用索引器的一个很好的例子。
一个 .Net 框架示例是 Dictionary。如果您在 .Net 中查看 Dictionary 类型的定义,您会发现它们允许您通过键获取值的访问权限。所以这是使用索引以字符串形式呈现的索引器的一个很好的例子。
如果没有索引器,你会怎么做?当然是按索引值,但它不能是字符串类型,那对用户友好吗?我猜不会!
因此索引器让您有机会很好地表示您的代码。
同样,在点类型的情况下,您当然可以通过索引访问值,即 0,1,2...99。如果你想让用户更友好怎么办,比如 point["x"]。这就是索引器可以帮助您的地方。
另一个例子我可以想到如果你想访问你的堆栈,比如 s1 而不是 push 和 s[0] 而不是 pop 方法。
Microsoft 提供了一个非常好的索引器示例,您可以通过提供字符位置作为索引来逐字节访问文件。
http://msdn.microsoft.com/en-us/library/aa288465(v=vs.71).aspx
【讨论】:
在您的代码行中,您定义了一个 point 对象数组,无论它们是什么。
point[] array = new point[100];
假设您可以直接访问数组,您可以像这样访问数组中的第一个元素:
var firstPoint = array[0];
您链接到的页面向您展示了如何访问该数组,如果它是在您的类中定义的,并且您无法直接访问该数组(因为它是私有的)。
例如,我们可以修改该页面上的示例以使用您的数组:
class SampleCollection
{
private Point[] arr = new Point[100];
public Point this[int i]
{
get { return arr[i]; }
set { arr[i] = value; }
}
}
然后你可以像这样访问数组中的第一个元素:
var sc = new SampleCollection();
var item1 = sc[0];
【讨论】:
那不是索引器。
索引器不用于创建对象数组,它实际上是 '[]' 运算符的运算符重载。
如果您想创建一个 List 包装类,则可以使用它。
为了保留方括号功能,您需要(并且想要)覆盖方括号运算符。这是通过索引器方法完成的。
【讨论】: