代码之家  ›  专栏  ›  技术社区  ›  Michael Gattuso

C索引器的意义或好处是什么?

  •  13
  • Michael Gattuso  · 技术社区  · 15 年前

    做一些代码阅读,无意中发现了我以前从未见过的这段代码:

    public SomeClass {
      public someInterface this[String strParameter] {
        get {
          return SomeInternalMethod(strParameter);
        }
      }
    }
    

    它的名称如下:

    SomeClass _someClass = new SomeClass();
    SomeInterface returnedValue = _someClass["someString"];
    

    我感兴趣的是这个函数在哪里合适,或者这种风格的写作意图是什么。例如,为什么这比简单地调用函数更可取?

    11 回复  |  直到 10 年前
        1
  •  20
  •   Robert Harvey    15 年前

    见语言规范第10.9节,其中规定:

    Indexer 是一个成员,它使对象能够以与数组相同的方式进行索引。

    索引器和属性在概念上非常相似,但在以下方面有所不同:

    • 属性由其名称标识,而索引器由其签名标识。
    • 属性通过简单名称(_§7.5.2)或成员访问(_§7.5.4)访问,而索引器元素通过元素访问(_§7.5.6.2)访问。
    • 属性可以是静态成员,而索引器始终是实例成员。
    • 属性的get访问器对应于没有参数的方法,而索引器的get访问器对应于与索引器具有相同形参列表的方法。
    • 属性的set访问器对应于具有一个名为value的参数的方法,而索引器的set访问器对应于具有与索引器相同的形参列表的方法,外加一个名为value的附加参数。
    • 索引器访问器声明与索引器参数同名的局部变量是一个编译时错误。
    • 在重写属性声明中,使用语法base.p访问继承的属性,其中p是属性名。在重写索引器声明中,使用语法基[e]访问继承的索引器,其中e是以逗号分隔的表达式列表。
        2
  •  16
  •   devuxer    13 年前

    似乎很多答案都集中在索引器是什么,而不是为什么你想使用索引器。

    就我而言,这就是使用索引器的动机:

    你在一个班上工作 某种类型的集合,但您希望类对用户(类的使用者)显示为 收藏。

    我能想到的最好的例子是 DataRow ADO.NET中的类。如果要获取 数据行 ,您可以使用 DataRow.Item[4] DataRow[4] .后一种形式是一种方便且合乎逻辑的快捷方式,它很好地展示了您为什么要使用索引器。对用户而言, 数据行 可以认为它只是一个单元格集合(即使它实际上比这还要多),因此可以直接获取和设置单元格值,而不必记住实际上正在获取/设置 Item .

    希望有帮助。

        3
  •  6
  •   Erich    15 年前

    在许多情况下,“index”语法很有意义。如果someClass表示某种集合,则特别有用。

        4
  •  3
  •   Randolpho    15 年前

    它允许您进行关联数组查找(也就是“字典样式”),正如您在问题中提到的那样。

    这就是重点。有些人喜欢这样,特别是来自内置了它的语言的人,比如python或php

        5
  •  3
  •   Simon Randy Burden    15 年前

    “this”关键字是索引器

    http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

    “索引器允许类或结构的实例像数组一样被索引。索引器与属性类似,只是其访问器接受参数。“

        6
  •  1
  •   Michael Stum    15 年前

    你可能已经遇到过类似的事情:

    var myList = new List<string>();
    myList.Add("One");
    myList.Add("Two");
    myList.Add("Three");
    
    for(int i = 0; i < myList.Count; i++) {
        string s = myList[i];
    }
    

    索引器是实现集合的对象的“主键”。如果你愿意的话,这只是一个写像.getvalue(index)这样的函数的简写方法。但这也清楚地表明了其意图。

        7
  •  0
  •   psychotik    15 年前

    它是索引运算符的一个实现 [ ] .

        8
  •  0
  •   Paolo    15 年前

    这是操作人员超载。如果您正在编写一个集合类,例如使用数组表示法(例如collection[someindex])访问该集合类是有意义的,则非常有用。

    当然,您可以编写一个collection.getElement(someIndex)函数等价物,但它是一个样式/可读性的东西。

        9
  •  0
  •   zmbush    15 年前

    你可以在一个键值对类中使用这个方法。

    我不确定C类中类似的类是什么,但是在C++ STL中,有一个映射类,其中调用方法与 SomeObject["key"] 它将返回与该键关联的“值”。

        10
  •  0
  •   SLaks    15 年前

    这被称为索引器,它们允许您使用list<gt;、array list、dictionary<gt;以及使用数组语法的所有其他集合。

    它只是句法上的糖分,但如果使用得当,它会提供一些可读性。

        11
  •  0
  •   max    10 年前

    在我看来,这只是一种语法上的便利。 你会在哪里 不是 使用它:

    public SomeClass {
      private int[] nums;
      public GetVal this[int ind] {
        get {
          return nums[ind]; // this is pointless since array is already indexed
        }
      }
    }
    

    你会在哪里 利益 从:

    public Matrix {
      private Dictionary<string, double> matrixData; // Matrix indecies, value
      public double this[int row, int col] {
        get {
          return matrixData[string.Format("{0},{1}", row, col)];
        }
      }
    }
    

    如您所见,出于某种原因,您的数据是一个用字符串键索引的字典,您希望用两个整数进行调用,但仍然不希望更改数据类型:

    Matrix m = new Matrix();
    ...
    Console.WriteLine( m[1,2] );