索引器Indexers

C#引入了一个索引器(Indexers)的功能,它能让我们像处理数组一样处理对象。在C#社区中,我们又把它叫做“智能数组(smart arrays)”。定义C#索引器就像定义属性一样方便。(这里“属性”指property,.

下面是它的结构

.net盲点:索引器Indexers (转)<modifier> <return type> this [argument list]
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) get
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) // Get codes goes here
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) set
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) // Set codes goes here
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)

注:

modifier:修饰词,如private, public, protected or internal

this:在C#中this是一个特殊的关键字,它表示引用类的当前实例。在这里它的意思是当前类的索引。

argument list:这里指索引器的参数。

它有几个规则:1. ref 和 out 参数不能使用

              2. 至少有一个参数

              3. 尽量使用整数或者字符串类型的参数

下面是一个索引器的例子

.net盲点:索引器Indexers (转)using System;
.net盲点:索引器Indexers (转)using System.Collections;
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class MyClass
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) private string []data = new string[5];
.net盲点:索引器Indexers (转) public string this [int index]
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) get
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) return data[index];
.net盲点:索引器Indexers (转)        }
.net盲点:索引器Indexers (转) set
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)        data[index] = value;
.net盲点:索引器Indexers (转)       }
.net盲点:索引器Indexers (转)   }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class MyClient
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public static void Main()
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)      MyClass mc = new MyClass();
.net盲点:索引器Indexers (转)      mc[0] = "Rajesh";//mc是一个对象,但是却像个数组,不是吗:)
.net盲点:索引器Indexers (转)      mc[1] = "A3-126";
.net盲点:索引器Indexers (转)      mc[2] = "Snehadara";
.net盲点:索引器Indexers (转)      mc[3] = "Irla";
.net盲点:索引器Indexers (转)      mc[4] = "Mumbai";
.net盲点:索引器Indexers (转)      Console.WriteLine("{0},{1},{2},{3},{4}",mc[0],mc[1],mc[2],mc[3],mc[4]);
.net盲点:索引器Indexers (转)    }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)

下面分别举几个继承、多态和抽象类与索引器的例子

索引器(Indexers)和继承

.net盲点:索引器Indexers (转)using System;
.net盲点:索引器Indexers (转)class Base//基类有一个索引器
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public int this[int indxer]
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)get
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write("Base GET");
.net盲点:索引器Indexers (转) return 10;
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) set
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write("Base SET");
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class Derived : Base
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)class MyClient
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public static void Main()
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) Derived d1 = new Derived();
.net盲点:索引器Indexers (转) d1[0] = 10;
.net盲点:索引器Indexers (转) Console.WriteLine(d1[0]);//照样使用索引器
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)//输出
.net盲点:索引器Indexers (转)Base SET
.net盲点:索引器Indexers (转)Base GET
.net盲点:索引器Indexers (转)10

索引器(Indexers)和多态

.net盲点:索引器Indexers (转)using System;
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class Base
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public virtual int this[int index]//有一个虚的索引器
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) get
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write("Base GET");
.net盲点:索引器Indexers (转) return 10;
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) set
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write("Base SET");
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class Derived : Base
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public override int this[int index]
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) get
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write("Derived GET");
.net盲点:索引器Indexers (转) return 10;
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) set
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write("Derived SET");
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class MyClient
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public static void Main()
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) Base b1 = new Derived();
.net盲点:索引器Indexers (转) b1[0]= 10;
.net盲点:索引器Indexers (转) Console.WriteLine(b1[0]);//这个时候也是显示Derived对象的索引器
.net盲点:索引器Indexers (转)  }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)//输出
.net盲点:索引器Indexers (转)Derived SET
.net盲点:索引器Indexers (转)Derived GET
.net盲点:索引器Indexers (转)10

抽象的索引器(Indexers)

.net盲点:索引器Indexers (转)using System;
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)abstract class Abstract
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public abstract int this[int index]
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) get;
.net盲点:索引器Indexers (转) set;
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class Concrete : Abstract
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public override int this[int index]
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) get
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write(" GET");
.net盲点:索引器Indexers (转) return 10;
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) set
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转)   Console.Write(" SET");
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)
.net盲点:索引器Indexers (转)class MyClient
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转)...{
.net盲点:索引器Indexers (转) public static void Main()
.net盲点:索引器Indexers (转).net盲点:索引器Indexers (转) ...{
.net盲点:索引器Indexers (转) Concrete c1 = new Concrete();
.net盲点:索引器Indexers (转) c1[0] = 10;
.net盲点:索引器Indexers (转) Console.WriteLine(c1[0]);
.net盲点:索引器Indexers (转) }
.net盲点:索引器Indexers (转)}
.net盲点:索引器Indexers (转)//输出
.net盲点:索引器Indexers (转)SET
.net盲点:索引器Indexers (转)GET
.net盲点:索引器Indexers (转)10
.net盲点:索引器Indexers (转)

索引器和属性(Property)

1. 索引器是以它的标识符来作为参数标识的。但是属性是以它的名称来作为参数标识的。

注:this [int i1]是以int作为它的标识,和this [int i2]属于同一个索引器。

2. 索引器一般访问的实例对象。但是属性一般访问的是静态对象。

3. 索引器一般使用数组的方式来访问。但是属性一般使用对象方法的方式访问。

注:索引器

MyClass mc = new MyClass();

 mc[0] = "Rajesh";

属性

MyClass mc = new MyClass();

 mc.Name = "Rajesh";

小结

1.索引器是可以进行重载、多态和抽象的,这点和一般的成员函数没有什么区别。

2.参数列表(argument list)可以有几个参数组成。this [int i1,int i2]

3.一个类存在两个或者两个以上的索引器时,参数列表(argument list)必须不同。this [int i1]和this [int i2]属于同一个索引器;this [int i1]和this [string s2]属于不同的索引器;

4.C#没有静态(static)的索引器。

相关文章: