索引器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 访问器还具有与索引器相同的形参表。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值