[C#基础教程]之快速了解c#中的索引器及与属性区别

C#中的索引器是新增加的,和属性有些不同。在c#中,属性可以是这样的:

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 访问器不存在,将发生编译时错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值