博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 索引器
阅读量:5321 次
发布时间:2019-06-14

本文共 4138 字,大约阅读时间需要 13 分钟。

概述

索引器允许类或结构的实例就像数组一样进行索引。 索引器类似于属性,不同之处在于它们的访问器采用参数。

在下面的示例中,定义了一个泛型类,并为其提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法)。 Program 类为存储字符串创建了此类的一个实例。

Code
1 class SampleCollection
2 {
3 // Declare an array to store the data elements. 4 private T[] arr = new T[100]; 5 6 // Define the indexer, which will allow client code 7 // to use [] notation on the class instance itself. 8 // (See line 2 of code in Main below.) 9 public T this[int i] 10 {
11 get 12 {
13 // This indexer is very simple, and just returns or sets 14 // the corresponding element from the internal array. 15 return arr[i]; 16 } 17 set 18 {
19 arr[i] = value; 20 } 21 } 22 } 23 24 // This class shows how client code uses the indexer. 25 class Program 26 {
27 static void Main(string[] args) 28 {
29 // Declare an instance of the SampleCollection type. 30 SampleCollection
stringCollection = new SampleCollection
(); 31 32 // Use [] notation on the type. 33 stringCollection[0] = "Hello, World"; 34 System.Console.WriteLine(stringCollection[0]); 35 } 36 }

索引器和属性比较

属性

索引器

允许像调用公共数据成员一样调用方法。

允许对一个对象本身使用数组表示法来访问该对象内部集合中的元素。

可通过简单的名称进行访问。

可通过索引器进行访问。

可以为静态成员或实例成员。

必须为实例成员。

属性的 get 访问器没有参数。

索引器的 get 访问器具有与索引器相同的形参表。

属性的 set访问器包含隐式 value 参数。

除了值参数外,索引器的 set 访问器还具有与索引器相同的形参表。

支持对自动实现属性使用短语法。

不支持短语法。

接口中使用索引器

索引器可在接口上声明。 接口索引器的访问器与类索引器的访问器具有以下方面的不同:

  • 接口访问器不使用修饰符。

  • 接口访问器没有体。

因此,访问器的用途是指示索引器是读写、只读还是只写。

接口索引器访问器的示例:

1 public interface ISomeInterface  2 {
3 //... 4 5 string this[int index] 6 {
7 get; 8 set; 9 } 10 }
 
如何实现借口索引器示例
1     // Indexer on an interface:  2     public interface ISomeInterface  3     {
4 // Indexer declaration: 5 int this[int index] 6 {
7 get; 8 set; 9 } 10 } 11 12 // Implementing the interface. 13 class IndexerClass : ISomeInterface 14 {
15 private int[] arr = new int[100]; 16 public int this[int index] // indexer declaration 17 {
18 get 19 {
20 // The arr object will throw IndexOutOfRange exception. 21 return arr[index]; 22 } 23 set 24 {
25 arr[index] = value; 26 } 27 } 28 } 29 30 class MainClass 31 {
32 static void Main() 33 {
34 IndexerClass test = new IndexerClass(); 35 System.Random rand = new System.Random(); 36 // Call the indexer to initialize its elements. 37 for (int i = 0; i < 10; i++) 38 {
39 test[i] = rand.Next(); 40 } 41 for (int i = 0; i < 10; i++) 42 {
43 System.Console.WriteLine("Element #{0} = {1}", i, test[i]); 44 } 45 46 // Keep the console window open in debug mode. 47 System.Console.WriteLine("Press any key to exit."); 48 System.Console.ReadKey(); 49 } 50 } 51 /* Sample output: 52 Element #0 = 360877544 53 Element #1 = 327058047 54 Element #2 = 1913480832 55 Element #3 = 1519039937 56 Element #4 = 601472233 57 Element #5 = 323352310 58 Element #6 = 1422639981 59 Element #7 = 1797892494 60 Element #8 = 875761049 61 Element #9 = 393083859 62 */

在上例中,可以通过使用接口成员的完全限定名来使用显式接口成员实现。 例如: 

1 public string ISomeInterface.this 2 { 3 }

但是,只有当类使用同一索引器签名实现一个以上的接口时,为避免多义性才需要使用完全限定名。 例如,如果 Employee 类实现的是两个接口 ICitizen 和IEmployee,并且这两个接口具有相同的索引器签名,则必须使用显式接口成员实现。 即,以下索引器声明: 

1 public string IEmployee.this 2 { 3 }

在 IEmployee 接口上实现索引器,而以下声明:

1 public string ICitizen.this 2 { 3 }

在 ICitizen 接口上实现索引器。

转载于:https://www.cnblogs.com/sunjinpeng/archive/2012/03/24/2415736.html

你可能感兴趣的文章
记录一下最近做系统性能优化的经验
查看>>
值类型与引用类型
查看>>
转:Can not issue data manipulation statements with executeQuery()错误解决
查看>>
详解C#委托,事件与回调函数(转)
查看>>
744. Find Smallest Letter Greater Than Target
查看>>
java实现二维码的生成.
查看>>
溃烂中的代码
查看>>
letecode [38] - Count and Say
查看>>
Windows Phone开发(13):如何规范用户的输入行为 转:http://blog.csdn.net/tcjiaan/article/details/7341513...
查看>>
error LNK2019: 无法解析的外部符号 该符号在函数 中【转】http://blog.sina.com.cn/s/blog_51890fea0100l41h.html...
查看>>
怎么卸载hexo
查看>>
如何将域名部署到Tomcat中,用域名访问服务器
查看>>
08.08 web字体 :语法 兼容性写法 字体格式 工具 字体颜图标 多列布局:相关属性 伸缩盒:概念 相关属性...
查看>>
南阳737----石子合并(一)
查看>>
js、jquery中全局替换replace
查看>>
一次U9身份验证http数据对接
查看>>
使用WCF进行跨平台开发之一(WCF的实现、控制台托管与.net平台的调用)
查看>>
Android 发展思路
查看>>
Pythonic
查看>>
contentprovider的学习实例总结
查看>>