原创 索引器 类似于属性 索引器可重载

  • 一句话的事儿:客制化数组

何为索引器?

索引器(Indexer) 允许一个对象可以像数组一样使用下标的方式来访问。
当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样。您可以使用数组访问运算符 [ ] 来访问该类的的成员。

语法

一维索引器的语法如下:

  1. element-type this[int index]
  2. {
  3. // get 访问器
  4. get
  5. {
  6. // 返回 index 指定的值
  7. }
  8. // set 访问器
  9. set
  10. {
  11. // 设置 index 指定的值
  12. }
  13. }

用途

索引器的行为的声明在某种程度上类似于属性(property)。就像属性(property),您可使用 getset 访问器来定义索引器。但是,属性返回或设置一个特定的数据成员,而索引器返回或设置对象实例的一个特定值。换句话说,它把实例数据分为更小的部分,并索引每个部分,获取或设置每个部分。
定义一个属性(property)包括提供属性名称。索引器定义的时候不带有名称,但带有 this 关键字,它指向对象实例。下面的实例演示了这个概念:

实例

  1. using System;
  2. namespace IndexerApplication
  3. {
  4. class IndexedNames
  5. {
  6. private string[] namelist = new string[size];
  7. static public int size = 10;
  8. public IndexedNames()
  9. {
  10. for (int i = 0; i < size; i++)
  11. namelist[i] = "N. A.";
  12. }
  13. //this是关键字
  14. public string this[int index]
  15. {
  16. get
  17. {
  18. string tmp;
  19. if( index >= 0 && index <= size-1 )
  20. {
  21. tmp = namelist[index];
  22. }
  23. else
  24. {
  25. tmp = "";
  26. }
  27. return ( tmp );
  28. }
  29. set
  30. {
  31. if( index >= 0 && index <= size-1 )
  32. {
  33. namelist[index] = value;
  34. }
  35. }
  36. }
  37. static void Main(string[] args)
  38. {
  39. IndexedNames names = new IndexedNames();
  40. names[0] = "Zara";
  41. names[1] = "Riz";
  42. names[2] = "Nuha";
  43. names[3] = "Asif";
  44. names[4] = "Davinder";
  45. names[5] = "Sunil";
  46. names[6] = "Rubic";
  47. for ( int i = 0; i < IndexedNames.size; i++ )
  48. {
  49. Console.WriteLine(names[i]);
  50. }
  51. Console.ReadKey();
  52. }
  53. }
  54. }

当上面的代码被编译和执行时,它会产生下列结果:
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.

重载

  1. using System;
  2. namespace IndexerApplication
  3. {
  4. class IndexedNames
  5. {
  6. private string[] namelist = new string[size];
  7. static public int size = 10;
  8. //构造函数,初始化
  9. public IndexedNames()
  10. {
  11. for (int i = 0; i < size; i++)
  12. {
  13. namelist[i] = "N. A.";
  14. }
  15. }
  16. //给索引器赋值,即N.A OR ""
  17. public string this[int index]
  18. {
  19. get
  20. {
  21. string tmp;
  22. if( index >= 0 && index <= size-1 )
  23. {
  24. tmp = namelist[index];
  25. }
  26. else
  27. {
  28. tmp = "";
  29. }
  30. return ( tmp );
  31. }
  32. set
  33. {
  34. if( index >= 0 && index <= size-1 )
  35. {
  36. namelist[index] = value;
  37. }
  38. }
  39. }
  40. //重载部分,即当索引的key等于对应的value时,则返回索引的下标值
  41. public int this[string name]
  42. {
  43. get
  44. {
  45. int index = 0;
  46. while(index < size)
  47. {
  48. if (namelist[index] == name)
  49. {
  50. return index;
  51. }
  52. index++;
  53. }
  54. return index;
  55. }
  56. }
  57. //使用索引器
  58. static void Main(string[] args)
  59. {
  60. IndexedNames names = new IndexedNames();
  61. names[0] = "Zara";
  62. names[1] = "Riz";
  63. names[2] = "Nuha";
  64. names[3] = "Asif";
  65. names[4] = "Davinder";
  66. names[5] = "Sunil";
  67. names[6] = "Rubic";
  68. // 使用带有 int 参数的第一个索引器
  69. for (int i = 0; i < IndexedNames.size; i++)
  70. {
  71. Console.WriteLine(names[i]);
  72. }
  73. // 使用带有 string 参数的第二个索引器
  74. Console.WriteLine(names["Nuha"]);
  75. Console.ReadKey();
  76. }
  77. }
  78. }

当上面的代码被编译和执行时,它会产生下列结果:
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2


  • 本文作者:GeekPower - Felix Sun
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!