索引器indexer

一、索引器的基本概述

        索引器定义类似于属性,但其功能与属性并不相同,可以看成是属性的增强版,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。

 

1、索引器的定义

 

定义的一般形式:

 

[修饰符] 数据类型this[索引类型 index]

 

{

 

    get{//获得属性的代码}                                                

 

    set{ //设置属性的代码}

 

}

 

修饰符包括public,protected,private,internal,new,virtual,sealed,override, abstract,extern.

 

this关键字用于定义索引器。this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称。

 

数据类型是表示将要存取的数组或集合元素的类型。

 

索引类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数,可以是字符串。

 

get访问器返回值。set访问器分配值。访问器的用途是指示索引器是可读写、只读还是只写的,如果是可读写的,访问器get或set均不能省略;如果只读的,省略set访问器;如果是只写的,省略get访问器。

 

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

 

索引器可被重载。

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

 

举例:相册索引

usingSystem;
 
namespace索引器
{
    class Program
    {
        static void Main(string[] args)
        {
            //实例化相册
            Ablum Myablum1 = new Ablum(2);
           
            //实例化两张照片
            Photo first = newPhoto("XiaoHong");
            Photo second = newPhoto("XiaoMing");
           
            //将两张照片赋给相册
            Myablum1[0] = first;
            Myablum1[1] = second;
           
            //按序号查找
            Photo testPhotos = Myablum1[0];
           Console.WriteLine(testPhotos.Title);
           
            //按标题查找
            Photo testPhotos1 =Myablum1["XiaoMing"];
           Console.WriteLine(testPhotos1.Title);
        }
    }
    class Photo
    {
        private string PhotoTitle;
        public Photo()
        {
        }
        public Photo(string title)
        {
            PhotoTitle = title;
        }
        public string Title
        {
            get { return PhotoTitle; }
        }
    }
 
    //相册类
    class Ablum
    {
        //照片数组
        private Photo[] photos;
       
        //构造函数
        public Ablum()
        {
        }
       
        public Ablum(int Capacity)
        {
            photos = new Photo[Capacity];
        }
                
       //索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。          
                  //如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。
       
                 //按序号索引
        public Photo this[int index]
        {
            get {
                if (index < 0 || index >=photos.Length)
                {
                   Console.WriteLine("索引有问题");
                    return null;
                }
                return photos[index];
            }
            set {
                if (index < 0 || index >=photos.Length)
                {
                   Console.WriteLine("索引有问题");
                    return;
                }
                photos[index] = value;
            }
        }
 
        //按标题索引
        public Photo this[string title]
        {
            get {
                foreach (Photo p in photos)
                {
                    if (p.Title == title)
                        return p;
                }
               Console.WriteLine("找不到");
                return null;
            }
        }
       
    }
}
 


2、另外,在接口中也可以声明索引器,接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器get或set,没有实现语句。

例如:

 

publicinterface IAddress
 
{
 
stringthis[int index]{get;set;}
 
stringAddress{get;set;}
 
stringAnswer();
 
}


 

 表示所声明的接口IAddress包含3个成员:一个索引器、一个属性和一个方法,其中,索引器是可读写的。

 

一般示例:

// Indexeron an interface:
 
publicinterface ISomeInterface
 
{
 
    // Indexer declaration:
 
    int this[int index]
 
    {
 
        get;
 
        set;
 
    }
 
}
 
 
 
//Implementing the interface.
 
classIndexerClass : ISomeInterface
 
{
 
    private int[] arr = new int[100];
 
    public int this[int index]   // indexer declaration
 
    {
 
        get
 
        {
 
            // Check the index limits.
 
            if (index < 0 || index >=100)
 
            {
 
                return 0;
 
            }
 
            else
 
            {
 
                return arr[index];
 
            }
 
        }
 
        set
 
        {
 
            if (!(index < 0 || index >=100))
 
            {
 
                arr[index] = value;
 
            }
 
        }
 
    }
 
}
 
 
 
classMainClass
 
{
 
    static void Main()
 
    {
 
        IndexerClass test = new IndexerClass();
 
        // Call the indexer to initialize theelements #2 and #5.
 
        test[2] = 4;
 
        test[5] = 32;
 
        for (int i = 0; i <= 10; i++)
 
        {
 
           System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
 
        }
 
    }
 
}
 


3、索引器和属性的区别

 

属性

索引器

允许调用方法,如同它们是公共数据成员。

允许调用对象上的方法,如同对象是一个数组。

可通过简单的名称进行访问。

可通过索引器进行访问。

可以为静态成员或实例成员。

必须为实例成员。

属性的 get访问器没有参数。

索引器的 get 访问器具有与索引器相同的形参表。

属性的 set 访问器包含隐式 value 参数。

除了 value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值