索引器 C#
概述
索引器允许类或结构的实例就像数组一样进行索引。 索引器类似于属性,不同之处在于它们的访问器采用参数。
在下面的示例中,定义了一个泛型类,并为其提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法)。 Program 类为存储字符串创建了此类的一个实例。

1 class SampleCollection<T>
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<string> stringCollection = new SampleCollection<string>();
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 接口上实现索引器。
【本文由“白字先生”发布,2017年05月08日】
索引器 C#的更多相关文章
- 【.net 深呼吸】细说CodeDom(7):索引器
在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...
- C# 索引器,实现IEnumerable接口的GetEnumerator()方法
当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...
- C#基础回顾(三)—索引器、委托、反射
一.前言 ------人生路 ...
- C#索引器
索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...
- C#之索引器
实际中不使用这个东西,只做了解 using System; using System.Collections.Generic; using System.Linq; using System.Text ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- 《精通C#》索引器与重载操作符(11.1-11.2)
1.索引器方法结构大致为<modifier><return type> this [argument list],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...
- 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不是.可以用任意类型. 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了 ...
- C# 索引器使用总结
1.索引器(Indexer): 索引器允许类或者结构的实例按照与数组相同的方式进行索引.索引器类似于属性,不同之处在于他们的访问采用参数. 最简单的索引器的使用 /// <summary> ...
- C# 类中索引器的使用二
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...
随机推荐
- Python2.7-codecs
codecs 自然语言编码转换模块 模块内的主要方法如下: codecs.encode(obj[, encoding[, errors]]):对obj用encoding编码codecs.decode( ...
- Python2.7-shutil
shutil 模块,高级文件操作模块,支持文件或文件夹的复制和删除 模块方法: shutil.copyfileobj(fsrc, fdst[, length]):将类文件对象(在python中打开的文 ...
- ssh推送.py程序到服务器端运行
C:\Users\jiangshan>ssh jiangshan@192.168.1.191jiangshan@192.168.1.191's password:Last login: Sun ...
- mssql2012的分页查询
sql2102支持的分页查询 注意:以下都是先执行排序,再取行数据 select* from t_workers order by worker_id desc offset 3 rows --先 ...
- Android开发——Fragment知识整理(二)
0. 前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...
- 阿里云OSS不同账号之间的迁移
目录 一.需求说明 二.Ossimport概述 三.配置运行环境 1.配置jdk环境 2.部署方式 3.下载并部署ossimport 四.修改单机Job的配置文件local_job.cfg 五.执行迁 ...
- cocos2d-x学习记录5——CCTransition场景过渡
利用CCTransition能够创建出一系列的场景过渡动画,能够使场景切换时更加绚丽丰富. CCTransition派生出很多过渡动画,传入的参数一般包括过渡时间和创建的场景. MyScene.h内容 ...
- centos 7 搭建开源堡垒机 Teleport 遇到的问题解决
不得不说 centos7 的环境版本就是高,没有再出现6.5下那些依赖组件的版本支持过低的错误了,所以说现在个人用户还是推荐用7,企业生产环境的话,可能6.5适合一些,至少2年前是这样. 安装过程: ...
- 异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 解决方案
原来是因为 AssetsMapper.xml 不知道为什么不见了,导致这个异常,在启动项目时的启动任务里调用到了它,然后因为没有这个xml,所以抛出异常 启动信息: C:\extend\Develop ...
- Nuxt 开发 - 项目初始化
Nuxt是基于Vue的一个应用框架,采用服务端渲染(SSR),可以让用户的Vue单页面应用(SPA)也可以有利于SEO. 项目初始化 参考:https://zh.nuxtjs.org/guide/in ...