关于C#中索引器的实现过程

「已注销」 2020-07-10 10:16:44
C#中索引器的实现过程,是否只能根据数字进行索引?
...全文
228 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
临世驻年 2020-07-10
  • 打赏
  • 举报
回复
简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。本文就会引领你设置类来采用索引器。但是,首先让我们概述下属性这个概念以便了解些必要的背景知识。 属性 假如你曾经用VB6编写过程序,那么你应该很熟悉属性方法才对,所谓属性方法其实就是特殊的类成员,它实现了对私有类域的受控访问。在C#语言中有两种属性方法,其一是get,通过它可以返回私有域的值,其二是set,通过它就可以设置私有域的值。比如说,以下面的代码为例,其间创建了一个FirstName 属性,由它控制对私有类成员firstname的访问:
class Person
{ 
private string firstname; 
public string FirstName { 
get {return firstname;} 
set {firstname = value;} 
} 
} 
属性声明可以如下编码: 
Person p = new Person(); 
p.FirstName = "Lamont"; 
Console.WriteLine (p.FirstName);
如你你所看到的那样,属性声明倒更像是域声明,只不过它还声明了两个特殊的成员,按照微软的说法就是所谓的访问函数(accessor)。当某一表达式的右边调用属性或者属性用作其他子程序(或者函数)的参数时即会调用get访问函数。反之,当表达式左边调用属性并且通过隐式传递value参数设置私有域值的情况下就会调用set访问函数。你可以创建只读属性,方法是省略set访问函数,这样任何设置属性的尝试都会产生编译错误。 采用索引器的益处 下面是它的结构
<modifier> <return type> this [argument list]
 ...{
 get
 ...{
 // Get codes goes here
 }
 set
 ...{
 // Set codes goes here
 }
 }
注: modifier:修饰词,如private, public, protected or internal this:在C#中this是一个特殊的关键字,它表示引用类的当前实例。在这里它的意思是当前类的索引。 argument list:这里指索引器的参数。 说了半天咱们转到正题上来,那么为什么我要兜这个圈子呢?其实,这是因为类的索引器非常像属性,从代码上看也是这样。以下是具有索引器的类示例,通过索引器会返回一个字符串:


class Sample { 
public string this [int index] { 
get {return "You passed " + index; } 
} 
} 

注意,这里的属性名是this,意思是回引类的当前实例,参数列表包含在方括号而非括号之内。还有,这是一个只读索引器。为了把它改成读/写类型,我又添加了一个set访问函数。在定义索引器的时候,你不一定只采用一个参数。索引器参数可以采用任何类型,不过int是通常采用也是最为合理的类型。同一类中还可能拥有一个以上的索引器(重载)。 如上定义了Sample类之后,我们就可以把索引器用作某种默认的属性,如下所示:
Sample s = new Sample(); 
Console.WriteLine(s[55]);
相应实现的类则必须为IimplementMe的索引器具体定义get和set访问函数。 以上就是有关索引器的一些基本概述了。现在你应该对索引器在你的开发中所具有的作用有了较深入的了解。
class SampleCollection<T>
{
    private T[] arr = new T[100];
    public T this[int i]
    {
        get
        {
            return arr[i];
        }
        set
        {
            arr[i] = value;
        }
    }
}

// This class shows how client code uses the indexer
class Program
{
    static void Main(string[] args)
    {
        SampleCollection<string> stringCollection = new SampleCollection<string>();
        stringCollection[0] = "Hello, World";
        System.Console.WriteLine(stringCollection[0]);
    }
}
江湖评谈 2020-07-10
  • 打赏
  • 举报
回复
不必,可以以任何类型进行索引

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧