C#索引器

 我来答
户如乐9318
2022-10-14 · TA获得超过6669个赞
知道小有建树答主
回答量:2559
采纳率:100%
帮助的人:141万
展开全部

  索引器概述

  索引器使得对象可按照与数组相似的方法进行索引

  get 访问器返回值 set 访问器分配值

  this 关键字用于定义索引器

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

  索引器不必根据整数值进行索引 由您决定如何定义特定的查找机制

  索引器可被重载

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

  C#语言一个最令人感兴趣的地方就是类的索引器(indexer) 简单说来 所谓索引器就是一类特殊的属性 通过它们你就可以像引用数组一样引用 自己的类 显然 这一功能在创建集合类的场合特别有用 而在其他某些情况下 比如处理大型文件或者抽象某些有限资源等 能让类具有类似数组的行为当然也是 非常有用的 本文就会引领你设置类来采用索引器 但是 首先让我们概述下属性这个概念以便了解些必要的背景知识

  属性

  假如你曾经用VB 编写过程序 那么你应该很熟悉属性方法才对 所谓属性方法其实就是特殊的类成员 它实现了对私有类域的受控访问 在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访问函数 这样任何设置属性的尝试都会产生编译错误

  采用索引器的益处

  说了半天咱们转到正题上来 那么为什么我要兜这个圈子呢?其实 这是因为类的索引器非常像属性 从代码上看也是这样 以下是具有索引器的类示例 通过索引器会返回一个字符串          class Sample {        public string this [int index] {        get {return You passed + index; }        }        }

  注意 这里的属性名是this 意思是回引类的当前实例 参数列表包含在方括号而非括号之内 还有 这是一个只读索引器 为了把它改成读/写类 型 我又添加了一个set访问函数 在定义索引器的时候 你不一定只采用一个参数 索引器参数可以采用任何类型 不过int是通常采用也是最为合理的类 型 同一类中还可能拥有一个以上的索引器(重载)

  如上定义了Sample类之后 我们就可以把索引器用作某种默认的属性 如下所示          Sample s = new Sample();        Console WriteLine(s[ ]);

  属性和索引器

  属性和索引器之间有好些差别

  类的每一个属性都必须拥有唯一的名称 而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)

  属性可以是static(静态的)而索引器则必须是实例成员

  为索引器定义的访问函数可以访问传递给索引器的参数 而属性访问函数则没有参数

  接口

  类似数组的行为常受到程序实现者的喜爱 所以你还可以为接口定义索引器 IList和 IDictionary集合接口都声明了索引器以便访问其存储的项目

  在为接口声明索引器的时候 记住声明只是表示索引器的存在 你只需要提供恰当的访问函数即可 不必包括范围修饰符 以下代码把索引器声明为接口IImplementMe的一部分          interface IImplementMe {        string this[int index]        {        get;        set;        }

  相应实现的类则必须为IimplementMe的索引器具体定义get和set访问函数

  以上就是有关索引器的一些基本概述了 现在你应该对索引器在你的开发中所具有的作用有了较深入的了解

  索引器允许类或结构的实例按照与数组相同的方式进行索引 索引器类似于属性 不同之处在于它们的访问器采用参数

  在下面的示例中 定义了一个泛型类 并为其提供了简单的 get 和 set 访问器方法(作为分配和检索值的方法) Program 类为存储字符串创建了此类的一个实例  

  class SampleCollection<T>        {            private T[] arr = new T[ ];            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[ ] = Hello World ;                System Console WriteLine(stringCollection[ ]);            }        }

lishixinzhi/Article/program/net/201311/11433

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AiPPT
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图... 点击进入详情页
本回答由AiPPT提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式