永发信息网

谁知道C#中什么是索引器,索引器的实现过程,是否只能根据数字进行索引?

答案:3  悬赏:60  手机版
解决时间 2021-03-25 18:49
谁知道C#中什么是索引器,索引器的实现过程,是否只能根据数字进行索引?
最佳答案
索引器就是对一个集合的快速访问方法,如一个类中有一个List类型的变量,可以使用this[int index]来访问该List变量,间接的就是this.List[index],索引器中的参数不一定是整数,也可以是其他类型,如字典使用的就是字符串。
全部回答
索引器允许类或结构的实例就像数组一样进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。 public string this[int index]//索引器 {
get
{
return XXXXXX; } set {
// }
}
索引用任何类型都行,但是要对应的设置,还有可以多看看msdn
C#语言一个最令人感兴趣的地方就是类的索引器(indexer)。简单说来,所谓索引器就是一类特殊的属性,通过它们你就可以像引用数组一样引用自己的类。显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让类具有类似数组的行为当然也是非常有用的。本文就会引领你设置类来采用索引器。但是,首先让我们概述下属性这个概念以便了解些必要的背景知识。
属性
假如你曾经用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访问函数,这样任何设置属性的尝试都会产生编译错误。
采用索引器的益处 下面是它的结构 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]);
属性和索引器
属性和索引器之间有好些差别:
类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。
属性可以是static(静态的)而索引器则必须是实例成员。
为索引器定义的访问函数可以访问传递给索引器的参数,而属性访问函数则没有参数。
接口
类似数组的行为常受到程序实现者的喜爱,所以你还可以为接口定义索引器,IList和 IDictionary集合接口都声明了索引器以便访问其存储的项目。
在为接口声明索引器的时候,记住声明只是表示索引器的存在。你只需要提供恰当的访问函数即可,不必包括范围修饰符。以下代码把索引器声明为接口IImplementMe的一部分:interface IImplementMe {
string this[int index]
{
get;
set;
}
相应实现的类则必须为IimplementMe的索引器具体定义get和set访问函数。
以上就是有关索引器的一些基本概述了。现在你应该对索引器在你的开发中所具有的作用有了较深入的了解。class SampleCollection
{
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 stringCollection = new SampleCollection();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
哪有一年四季都是秋天的地方··
如何用槽式光电开关来控制一个70TPS16可控硅
GTS450要多大的电源功率才可以?
趣味测试:你造你的魅力值,会比较吸引哪个男
汽车如果不休息能连续能跑1000公里吗
家中电器声音超过38分贝属于噪音吗
国内硕士毕业后想出国读博士相关问题
有1.13C上能用的暗黑通吗
1升等于多少立方米
江西夏季山上特产有哪些?
鼻尖发黑
水曲柳白漆擦金施工方法
IPZ370链接,要能用的
—Thepartyisagreatsuccess.We'vehadagoodtim
月费率1.29,年化利率多少
推荐资讯
lol我要光打匹配绝不一盘排位,把战斗力打上4
给一些动漫中热门 最好听的歌?
人食用干海苔注册商标属于哪一类?
织金县自强中学地址在哪,我要去那里办事,
花家山下流花港,花著鱼身鱼嘬花 作者是谁
温州市龙湾蒲州鼎泰标准件厂地址在什么地方,
求歌词:(歌曲《笑对人生》 叶文祥词 桂炳赫
朗诵《满江红》(岳飞)应配什么音乐
单选题下列关于亚里士多德的叙述,不确切的是
金色时代KTV地址在什么地方,我要处理点事!
安庆市二零一八年办理公租房的时间`
—When were you born?—I was born .A. on J
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?