class Person {
private string firstname;
public string FirstName
{
get {return firstname;}
set {firstname = value;}
}
}
属性声明可以如下编码:
Person p = new Person();
p.FirstName = "TOM";
Console.WriteLine (p.FirstName);
属性声明倒更像是域声明,只不过它还声明了两个特殊的成员,按照微软的说法就是所谓的访问函数(accessor)。当某一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数。反之,当表达式左边调用属性并且通过隐式传递value参数设置私有域值的情况下就会调用set访问函数。
索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用。索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。下面是个例子:
using System; namespace IndexerExample { Class MyPreviousExp { private string[] myCompanies = new string[10]; //index creation public string this[int index] { get { if(index <0 or index >= 6) return "null"; else return myCompanies[index]; } set { if(!(index <0 or index >= 10)) myCompanies[index] = value; } } } Class myMainClass { public static void Main() { myPreviousExp indexerObj = new myPreviousExp(); indexerObj[0] = "AMS" indexerObj[3] = "HCL" indexerObj[5] = "ACC" for(int i=0; i<10; i++ { Console.WriteLine(" My Companies{0} : {1} ",i,indexerObj[i]); } } } } 可见,我们象通过数组那样,访问到了其中的元素,而通过 myPreviousExp indexerObj = new myPreviousExp(); 建立了索引器,再通过 indexerObj[0] = "AMS" indexerObj[3] = "HCL" indexerObj[5] = "ACC" 设置值 最后输出为:myCompanies 0 : AMS myCompanies 1 : myCompanies 2 : myCompanies 3 : HCL myCompanies 4 : myCompanies 5 : ACC myCompanies 6 : null myCompanies 7 : null myCompanies 8 : null myCompanies 9 : null
2-------细谈C#中的索引器跟属性的区别
细谈C#中的索引器跟属性的区别: 索引器允许您按照与数组的方式对类、结构、接口进行索引。注意要声明类或结构上的索引,一定要使用this关键字
,比如:public int this [int index] 索引器的特点: 1)允许调用对象上的方法,如同对象是一个数组。 2)可以通过索引器进行访问。 3)必须为实例成员。 4)索引器的get访问器具有与索引器相同的行参列表。 5)除了value参数外,索引器的set访问器还具有与索引器相同的行参表。
属性的特点: 1)允许调用方法,如同它们是公共数据成员。 2)可以通过简单的名称进行访问。 3)可以为静态成员或者实例成员。 4)属性的get访问器没有参数。 5)属性的set访问器包含隐式value参数。
举个例子说明如何声明私有数组和索引器,使用索引器访问实例test[i]代码如下: class IndexerClass { private int[] arr=new int [100]; public int this[int index] { get { if (index<0||index>=100) { return 0; } else { return arr[index]; } } set { if(!(index<0||index>=100)) { arr[index]=value; } } } } class MainClass { static void Main() { IndexerClass test =new IndexerClass(); test[3]=256; test[5]=1024; for(int i=0;i<=10;i++) { System.Console.WriteLine("Element#{0}={1}",i,test[i]); } } } 请注意,当计算索引器的访问时(例如,在 Console.Write 语句中),将调用 get 访问器。因此,如果 get 访问器不存在,将发生编译时错误。