我在MSDN - Indexers中读到了关于索引器的内容,它解释了我们如何使用带索引的数组等对象,就像普通的数组一样。但是,我认为我们可以创建像
这样的对象数组point[] array = new point[100];
那么Indexer对象数组的特殊优势是什么?
答案 0 :(得分:5)
如果你所追求的只是一组对象,那么索引器对数组完全没有好处。但是,如果您需要存储状态以及集合,那么索引器就会闪耀。
例如,请考虑以下内容
public class Tree
{
private Branch[] branches = new Branch[100];
...
public string Name { get; set; }
public Branch this[int i]
{
get
{
return branches[i];
}
}
}
Tree
拥有一个内部集合,但也拥有它自己的状态。拥有索引器属性允许简单访问底层集合,例如
tree.Name = "Tree";
var branch = tree[0];
答案 1 :(得分:4)
不是你在上面提到的这种情况。但是,如果您有任何无法表示为数组的内容,则将成为使用Indexers的一个很好的示例。
一个.Net框架示例是Dictionary。如果你在.Net中看到字典类型的定义,你会发现它们让你通过密钥获得价值访问。所以这是使用索引器的一个很好的例子,索引以字符串形式呈现。
没有索引器,你会怎么做?当然通过索引值,但它不能是字符串类型然后,这将是用户友好的吗?我猜不会!
所以索引器让你有机会很好地代表你的代码。
同样,在点类型的情况下,您当然可以访问索引值,即0,1,2 ... 99。如果您想要提高用户友好性,例如点[" x"],该怎么办?这就是索引者会帮助你的地方。
另一个例子我可以考虑如果你想要像s 1而不是push和s [0]而不是pop方法那样访问你的堆栈。
Microsoft有一个非常好的索引器示例,您可以通过提供字符位置作为索引来逐字节访问文件。
http://msdn.microsoft.com/en-us/library/aa288465(v=vs.71).aspx
答案 2 :(得分:2)
在您的代码行中,您已经定义了point
个对象的数组,无论它们是什么。
point[] array = new point[100];
假设您可以直接访问数组,可以像下面这样访问数组中的第一个元素:
var firstPoint = array[0];
您链接到的页面向您展示了如何访问该数组,如果它是在您的类中定义的,并且您没有直接访问该数组(因为它是私有的)。< / p>
例如,我们可以修改该页面上的示例以使用您的数组:
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];
答案 3 :(得分:2)
那不是索引器。
索引器不用于创建对象数组,它实际上是'[]'运算符的运算符重载。
如果你想创建一个List
包装类,可以使用它的一个例子。
为了保留方括号功能,您需要(并希望)覆盖方括号运算符。这是通过索引器方法完成的。