C#索引器.docx
《C#索引器.docx》由会员分享,可在线阅读,更多相关《C#索引器.docx(22页珍藏版)》请在冰豆网上搜索。
![C#索引器.docx](https://file1.bdocx.com/fileroot1/2023-2/25/c92b05d2-de6f-4853-8262-b8429d3a4f96/c92b05d2-de6f-4853-8262-b8429d3a4f961.gif)
C#索引器
C#索引器详解
索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。
被称为有参属性。
简单的索引器实例:
classProgram
{
staticvoidMain(string[]args)
{
IndexClassa=newIndexClass();
a[0]="张三";
a[1]="李四";
a[2]="王五";
Console.WriteLine("a[0]="+a[0]);
Console.WriteLine("a[1]="+a[1]);
Console.WriteLine("a[2]="+a[2]);
Console.ReadKey();
}
}
classIndexClass
{
privatestring[]name=newstring[10];
publicstringthis[intindex]
{
get{returnname[index];}
set{this.name[index]=value;}
}
}
索引器与数组的比较:
索引器的索引值不受类型限制。
用来访问数组的索引值一定是整数,而索引器可以是其他类型的索引值。
索引器允许重载,一个类可以有多个索引器。
索引器不是一个变量没有直接对应的数据存储地方。
索引器有get和set访问器。
索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。
被称为有参属性。
简单的索引器实例:
索引器与属性的比较:
标示方式:
属性以名称来标识,索引器以函数签名来标识。
索引器可以被重载。
属性则不可以被重载。
属性可以为静态的,索引器属于实例成员,不能被声明为static
多参数索引器实例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Collections;
namespaceStudy
{
classProgram
{
staticvoidMain(string[]args)
{
ScoreIndexs=newScoreIndex();
s["张三",1]=90;
s["张三",2]=100;
s["张三",3]=80;
s["李四",1]=60;
s["李四",2]=70;
s["李四",3]=50;
Console.WriteLine("张三课程编号为1的成绩为:
"+s["张三",1]);
Console.WriteLine("张三的所有成绩为:
");
ArrayListtemp;
temp=s["张三"];
foreach(IndexClassbintemp)
{
Console.WriteLine("姓名:
"+b.Name+"课程编号:
"+b.CourseID+"分数:
"+b.Score);
}
Console.ReadKey();
}
}
classIndexClass
{
privatestring_name;
privateint_courseid;
privateint_score;
publicIndexClass(string_name,int_courseid,int_score)
{
this._name=_name;
this._courseid=_courseid;
this._score=_score;
}
publicstringName
{
get{return_name;}
set{this._name=value;}
}
publicintCourseID
{
get{return_courseid;}
set{this._courseid=value;}
}
publicintScore
{
get{return_score;}
set{this._score=value;}
}
}
classScoreIndex
{
privateArrayListarr;
publicScoreIndex()
{
arr=newArrayList();
}
publicintthis[string_name,int_courseid]
{
get
{
foreach(IndexClassainarr)
{
if(a.Name==_name&&a.CourseID==_courseid)
{
returna.Score;
}
}
return-1;
}
set
{
arr.Add(newIndexClass(_name,_courseid,value));//arr["张三",1]=90
}
}
//重载索引器
publicArrayListthis[string_name]
{
get
{
ArrayListtemp=newArrayList();
foreach(IndexClassbinarr)
{
if(b.Name==_name)
{
temp.Add(b);
}
}
returntemp;
}
}
}
}
备注:
所有索引器都使用this关键词来取代方法名。
Class或Struct只允许定义一个索引器,而且总是命名为this。
索引器允许类或结构的实例按照与数组相同的方式进行索引。
索引器类似于属性,不同之处在于它们的访问器采用参数。
get访问器返回值。
set访问器分配值。
this关键字用于定义索引器。
value关键字用于定义由set索引器分配的值。
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
索引器可以使用百数值下标,而数组只能使用整数下标:
如下列定义一个String下标的索引器
publicintthis[stringname]{...}
属性和索引器
属性和索引器之间有好些差别:
类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。
属性可以是static(静态的)而索引器则必须是实例成员。
使用索引器的优点
分类:
C#2012-02-2620:
55 219人阅读 评论(0) 收藏 举报
stringinterface优化工具c
//可容纳100个整数的整数集
privatelong[]arr=newlong[100];
//声明索引器
publiclongthis[intindex]
{
get
{//检查索引范围
if(index<0||index<=100)
{
return0;
}
else
{
returnarr[index];
}
}
set
{
if(!
(index<0||index<=0))
{
arr[index]=value;
}
}
这个例子就能看出好处来
避免了一个异常
索引器类型表示该索引器使用哪一类型的索引来存取数组或集合元素,可以是整数,可以是字符串
但是索引器的用处也是有的,比如数组下标超出范围的异常,当合理的使用索引器可以极大的提升数组或者集合的稳定性
还有就是索引优化,跟限制插入
比如{"a","B","C","d"}我们不知道数组中有多少个,但是我们把a不让他输入到数组中
合理的避免了很多不想要的数据
索引器是高级应用的中一个重要组成部分,其实应用也没啥高级低级,不过这个玩意用好了,确实是好东西
回复pazza(375650524)20:
17:
08
索引器优化下面说的确实有点不明白,上面说的明白,我再查查资料
其实你只要考虑到一点,就是下标异常,跟数据过滤就足以让我们使用索引器了
我们的索引器是构造一个安全稳定的数组或者集合的空间,集合或者数组只是一个容器,他没办法进行过滤操作,我们要插入的数据也不能每次都保证是正确的,那么我们就需要在之前去判断浪费很多逻辑资源在代码中,而索引器,在构造的时候检查,完全可以吧用for循环过滤写成这个样子
publiclongthis[intindex]
{
get
{//检查索引范围
if(index<0||index<=100)
{
return0;
}
if(arr[index]==14){
retrun16;
}
else
{
returnarr[index];
}
}
set
{
if(!
(index<0||index<=0))
{
arr[index]=value;
}
}
}
这是一种写法,这个样子的好处是,只要我们的索引器中会出现14,那么真实数据就会替换为16
针对很多过滤的数据就很有用处
比如我们日常开发中总是有些要替换掉的关键字,什么反党,反政府啥的,如果我们一篇文章为1000个字,那么我们接受的时候就需要过滤所有的字去替换,这个先不说代码的复杂度,其实只需要一个索引器就搞定了
不过写法到不是这么简单 我记得搭配的还有一个工具,但是我忘了
索引器你可以这么理解,咱们哈希表是底层,那么在我们插入的数据计入哈希表的时候,是不是也是一条一条进入的,索引器不带循环过滤,但是他只是匹配你插入的东西,比如咱们插入1,2,3,4,这个样子if(xx==3){
retrunarr[xx]=6;
}
过程是插到3的时候索引就会过滤掉6
而且索引器还可以写在接口中,这个东西你可以不用,但是用还是能用的
publicinterfaceIAddress
{
stringthis[intindex]{get;set;}
stringAddress{get;set;}
stringAnswer();
}
额,怎么说呢,话说常用的方式多数是泛型集合
但是针对某些东西的时候,索引还是可以用的
////////////////////////////
C#类中索引器的使用
分类:
C#2012-02-2518:
45 75人阅读 评论(0) 收藏 举报
c#
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。
索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。
定义了索引器的类可以让您像访问数组一样的使用[]运算符访问类的成员。
(当然高级的应用还有很多,比如说可以把数组通过索引器映射出去等等)
本文只是简单演示一下索引器的概念和基本的使用方法:
请看代码,下面是类的定义,中间包含了一个索引器定义
类的定义
--
CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http:
//www.CodeH
--> public class Person
{
//定义两个字段信息
private string name;
private string password;
//定义一个 Name 属性来操作 name 字段
public string Name
{
set { name = value; }
get { return name; }
}
//定义一个 Password 属性来操作 password 字段
public string Password
{
set { password = value; }
get { return password; }
}
//定义索引器,name 字段的索引值为 0 ,password 字段的索引值为 1
public string this[int index]
{
get
{
if (index == 0) return name;
else if (index == 1) return password;
else return null;
}
set
{
if (index == 0) name = value;
else if (index == 1) password = value;
}
}
}
复制代码
下面是使用索引器的方法:
索引器使用
--
CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http:
//www.CodeH
--> protected void Page_Load(object sender, EventArgs e)
{
//声明并实例化这个类
Person p = new Person();
//使用索引器的方式来给类的两个属性赋值
p[0] = "jarod";
p[1] = "123456,./";
//使用类属性取得两个字段信息
Label1.Text = p.Name + " / " + p.Password;
}
复制代码
非常简单,在上面的类中我们把类的name字段映射的索引值为0,而password字段映射的索引值为1。
有了这个映射就可以使用以下方式为类的name和password赋值了。
p[0] = "jarod"; //设置 name 字段值
p[1] = "123456,./"; //设置 password 字段值
复制代码
赋值后,就可以使用属性方法访问到刚刚给两个字段赋的值了。
////////////////////////
C#类中索引器的使用
分类:
C#2012-02-2518:
45 77人阅读 评论(0) 收藏 举报
c#
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。
索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。
定义了索引器的类可以让您像访问数组一样的使用[]运算符访问类的成员。
(当然高级的应用还有很多,比如说可以把数组通过索引器映射出去等等)
本文只是简单演示一下索引器的概念和基本的使用方法:
请看代码,下面是类的定义,中间包含了一个索引器定义
类的定义
--
CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http:
//www.CodeH
--> public class Person
{
//定义两个字段信息
private string name;
private string password;
//定义一个 Name 属性来操作 name 字段
public string Name
{
set { name = value; }
get { return name; }
}
//定义一个 Password 属性来操作 password 字段
public string Password
{
set { password = value; }
get { return password; }
}
//定义索引器,name 字段的索引值为 0 ,password 字段的索引值为 1
public string this[int index]
{
get
{
if (index == 0) return name;
else if (index == 1) return password;
else return null;
}
set
{
if (index == 0) name = value;
else if (index == 1) password = value;
}
}
}
复制代码
下面是使用索引器的方法:
索引器使用
--
CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http:
//www.CodeH
--> protected void Page_Load(object sender, EventArgs e)
{