C#入门--索引器

  索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。

索引器概述

  • 索引器使得对象可按照与数组相似的方法进行索引。

  • get 访问器返回值。set 访问器分配值。

  • this 关键字用于定义索引器。

  • value 关键字用于定义由 set 索引器分配的值。

  • 索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。

  • 索引器可被重载。

  • 索引器可以有多个形参,例如当访问二维数组时。

class SampleCollection<T>
{
private T[] arr = new T[];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
} // This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[] = "Hello, World";
System.Console.WriteLine(stringCollection[]);
}
}

  在上面的示例中,定义了一个泛型类,并为其提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法)。

属性和索引器之间的比较

索引器与属性类似。除下表中显示的差别外,为属性访问器定义的所有规则同样适用于索引器访问器。

属性 索引器
允许调用方法,如同它们是公共数据成员。 允许调用对象上的方法,如同对象是一个数组。
可通过简单的名称进行访问。 可通过索引器进行访问。
属性的 get 访问器没有参数。 索引器的 get 访问器具有与索引器相同的形参表。
属性的 set 访问器包含隐式 value 参数。 除了 value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。
可以为静态成员或实例成员。 必须为实例成员。

接口中的索引器

接口索引器的访问器与类索引器的访问器具有以下方面的不同:

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

  • 接口访问器没有体。

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

// 接口索引器
public interface ISomeInterface
{
// 申明索引器
int this[int index]
{
get;
set;
}
} // 继承接口
class IndexerClass : ISomeInterface
{
private int[] arr = new int[];
public int this[int index] // 索引器申明
{
get
{
// 检查索引限制
if (index < || index >= )
{
return ;
}
else
{
return arr[index];
}
}
set
{
if (!(index < || index >= ))
{
arr[index] = value;
}
}
}
} class MainClass
{
static void Main()
{
IndexerClass test = new IndexerClass();
// 通过索引器初始化索引2与5
test[] = ;
test[] = ;
for (int i = ; i <= ; i++)
{
System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
}
}
}

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

public string IEmployee.this
{
}

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

public string ICitizen.this
{
}

ICitizen 接口上实现索引器。

可靠编程

提高索引器的安全性和可靠性有两种主要的方法:

  • 当设置并检索来自索引器访问的任何缓冲区或数组的值时,请始终确保您的代码执行范围和类型检查。

  • 应当为 get 和 set 访问器的可访问性设置尽可能多的限制。这一点对 set 访问器尤为重要。

C#入门--索引器的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  2. C# 索引器,实现IEnumerable接口的GetEnumerator()方法

    当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...

  3. C#基础回顾(三)—索引器、委托、反射

    一.前言                                                                                       ------人生路 ...

  4. C#索引器

    索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...

  5. C#之索引器

    实际中不使用这个东西,只做了解 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  6. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  7. 《精通C#》索引器与重载操作符(11.1-11.2)

    1.索引器方法结构大致为<modifier><return type> this [argument list],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...

  8. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

    不是.可以用任意类型. 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了 ...

  9. C# 索引器使用总结

    1.索引器(Indexer): 索引器允许类或者结构的实例按照与数组相同的方式进行索引.索引器类似于属性,不同之处在于他们的访问采用参数. 最简单的索引器的使用 /// <summary> ...

随机推荐

  1. [poj 1185] 炮兵阵地 状压dp 位运算

    Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...

  2. cuda by example

    int offset= x+y*dim   x 线程块内的线程索引 y 线程块索引 dim 线程块的维度   tid = threadIdx.x+blockIdx.x*blockDim.x 计算大于或 ...

  3. SP8222 NSUBSTR - Substrings

    \(\color{#0066ff}{ 题目描述 }\) 你得到一个字符串,最多由25万个小写拉丁字母组成.我们将 F(x)定义为某些长度X的字符串在s中出现的最大次数,例如字符串'ababaf'- F ...

  4. EOS 增发与生产者的奖励制度

    EOS每年增发1%的机制在系统合约中,其实说每年增发1%只是一年的总数,其实是只要在出块,EOS就在增发的路途中,下面分析一下增发的代码. 其实增发的1%的都是分给所有区块生产者的,只要出块了或者获得 ...

  5. CoreData 数据库

    封装CoreManager类 @implementation CoreDataManager { //上下文 NSManagedObjectContext *_ctx; } //单例 +(instan ...

  6. uwsgi01---uwsgi文件

    1. 安装 pip install uwsgi //测试uWSGI是否安装成功 在终端中输入以下命令查看uwsgi的版本:uwsgi --version 2.简单运行 运行uwsgi:uwsgi -- ...

  7. Java实现微信小程序支付(准备)

    Java语言开发微信小程序支付功能: 1.通过https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1路径到官方下载Java的支付SD ...

  8. (转)TestNG框架提供两种传入参数的方法:

    1.从testng.xml传入参数. 如果参数是一些简单的值,可以直接在testng.xml中定义.这也是最常用的一种. 可以在测试用例中给参数一个默认值.这样,即使在xml文件中没有这个变量,你的测 ...

  9. stdin stdout stderr 标准I/O流

    Unix中一切皆文件,磁盘等设备在操作系统来看都是文件. 对文件进行操作时,需要打开这个文件,并获得文件描述符(file descriptor, fd) 而每个进程生来就有三个文件描述符绑定在它身上, ...

  10. hdu2063 最大二分匹配(匈牙利算法)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...