【问题标题】:Advantages of indexers over object array?索引器相对于对象数组的优势?
【发布时间】:2014-09-20 14:15:38
【问题描述】:

我在MSDN - Indexers 中读到了关于索引器的内容,它解释了我们如何使用带有索引的数组之类的对象,即就像普通数组一样。但是,我认为我们可以创建对象数组,例如

point[] array = new point[100];

那么Indexer相对于对象数组的特殊优势是什么?

【问题讨论】:

    标签: c# arrays indexer


    【解决方案1】:

    如果您所追求的只是对象的集合,那么索引器绝对没有数组的优势。但是,如果您需要存储状态和集合,那就是索引器的亮点。

    例如,考虑以下情况

    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];
    

    【讨论】:

      【解决方案2】:

      在你上面提到的这种情况下不是。但是,如果您有任何不能表示为数组的东西,那么将是使用索引器的一个很好的例子。

      一个 .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

      【讨论】:

        【解决方案3】:

        在您的代码行中,您定义了一个 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];
        

        【讨论】:

          【解决方案4】:

          那不是索引器。

          索引器不用于创建对象数组,它实际上是 '[]' 运算符的运算符重载。

          如果您想创建一个 List 包装类,则可以使用它。

          为了保留方括号功能,您需要(并且想要)覆盖方括号运算符。这是通过索引器方法完成的。

          【讨论】:

            猜你喜欢
            • 2018-10-22
            • 1970-01-01
            • 2018-04-13
            • 2017-03-19
            • 2010-12-23
            • 2015-07-23
            • 2011-02-26
            • 1970-01-01
            • 2012-05-08
            相关资源
            最近更新 更多