c索引器(c索引器实现过程)

http://www.itjxue.com  2023-02-23 06:41  来源:未知  点击次数: 

Csharp初学者,举个妙用索引器的例子,用来重复说明索引器的作用,为理解概念提供帮助,不要过于简单。

索引器说白一点就是能够像数组一样方便的操纵数据。

.net类库程序随处可见索引器的例子

string str ="abc";

char c=str[0]; //str[0]就是索引器的例证,有这玩意不是取数据简单方便了?

再比如

datarow row= datatable.rows[0] //这样取数据行不就方便了?

再举个自定义的例子

public class IndexerDemo{

string[] strs=new string[3];

public string this[index]{

get{ return strs[index];}

set {strs[index]=value;}

}

}

IndexerDemo indexer=new IndexDemo();

indexer[0]="a"; //赋值

indexer[1]="b";

indexer[2]="c";

string str =indexer[0];//取值这样操作数据不是很方便吗?自己去实践领悟吧,这东西作用大着点。

C#中,索引器的作用和用法

索引器的两种用法 和 作用 索引器允许您按照与数组相同的方式对类、结构或接口进行索引。有关对接口使用索引器的更多信息,请参见接口索引器。 要声明类或结构上的索引器,请使用 this 关键字,如下例所示: 复制代码 public int this[int index] // Indexer declaration { // get and set accessors } 备注 索引器类型及其参数类型必须至少如同索引器本身一样是可访问的。有关可访问级别的更多信息,请参见访问修饰符。 索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。 索引器值不归类为变量;因此,不能将索引器值作为 ref 或 out 参数来传递。 要为索引器提供一个其他语言可以使用的名字,请使用声明中的 name 属性。例如: 复制代码 [System.Runtime.CompilerServices.CSharp.IndexerName("TheItem")] public int this [int index] // Indexer declaration { } 此索引器将具有名称 TheItem。不提供名称属性将生成 Item 默认名称。 示例1 说明 下面的示例说明如何声明私有数组字段、arr 和索引器。使用索引器可直接访问实例 test[i]。另一种使用索引器的方法是将数组声明为 public 成员并直接访问它的成员 arr[i]。 代码 C# 复制代码 class IndexerClass { 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; } } } } class MainClass { static void Main() { IndexerClass test = new IndexerClass(); // Call the indexer to initialize the elements #3 and #5. test[3] = 256; test[5] = 1024; for (int i = 0; i = 10; i++) { System.Console.WriteLine("Element #{0} = {1}", i, test[i]); } } } 输出 Element #0 = 0 Element #1 = 0 Element #2 = 0 Element #3 = 256 Element #4 = 0 Element #5 = 1024 Element #6 = 0 Element #7 = 0 Element #8 = 0 Element #9 = 0 Element #10 = 0 请注意,当计算索引器的访问时(例如,在 Console.Write 语句中),将调用 get 访问器。因此,如果 get 访问器不存在,将发生编译时错误。 使用其他值进行索引 C# 并不将索引类型限制为整数。例如,对索引器使用字符串可能是有用的。通过搜索集合内的字符串并返回相应的值,可以实现此类的索引器。由于访问器可被重载,字符串和整数版本可以共存。 示例2 说明 在此例中,声明了存储星期几的类。声明了一个 get 访问器,它接受字符串(天名称),并返回相应的整数。例如,星期日将返回 0,星期一将返回 1,等等。 代码 C# 复制代码 // Using a string as an indexer value class DayCollection { string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" }; // This method finds the day or returns -1 private int GetDay(string testDay) { int i = 0; foreach (string day in days) { if (day == testDay) { return i; } i++; } return -1; } // The get accessor returns an integer for a given string public int this[string day] { get { return (GetDay(day)); } } } class Program { static void Main(string[] args) { DayCollection week = new DayCollection(); System.Console.WriteLine(week["Fri"]); System.Console.WriteLine(week["Made-up Day"]); } } 输出 5 -1 可靠编程 提高索引器的安全性和可靠性有两种主要的方法: 当设置并检索来自索引器访问的任何缓冲区或数组的值时,请始终确保您的代码执行范围和类型检查。 应当为 get 和 set 访问器的可访问性设置尽可能多的限制。这一点对 set 访问器尤为重要。有关更多信息,请参见非对称访问器可访问性(C# 编程指南)。

C#中索引器的实现过程

不,可根据任何类型进行索引。

例如:

//这种设计仅供教学^_^

class 例子

{

public int a, b, c;

public int this[string 字]

{

get

{

if (字 == "a") return a;

if (字 == "b") return b;

if (字 == "c") return c;

throw new Exception("...");

}

set

{

if (字 == "a") a = value;

else if (字 == "b") b = value;

else if (字 == "c") c = value;

else throw new Exception("...");

}

}

}

//使用举例:

例子 仅供参考 = new 例子();

仅供参考["a"]=0; 仅供参考["b"]=1; 仅供参考["c"]=2;

你也可以把索引定义为浮点数,窗体,阅读器,指针等等任何稀奇古怪的类型,只要它属于Object。

下列关于C#中索引器理解正确的是( )

答案为:D

楼主可以在下面这个链接看看介绍

public object this[object key]

{

get { return ht[key]; }

set { ht[key] = value); }

}

这个例子中参数为一个,形参类型为object不是Integer的,

索引器声明类似于属性声明,主要区别是索引器是无名称的(由于 this 被索引,因此在声明中使用的“名称”为 this)

楼上的谁说索引器只能有一个,只要形参个数与类型不一样都可以

在C#中什么是属性、方法、事件、继承、接口、封装、索引器?

方法。就是c/c++中的函数,如果你不懂得函数,你就理解成完成某种特定任务的一个代码模块。

property,属性。(这里还有个attribute,也可以翻译成属性,但有些书把attribute翻译成性质,或者干脆两者都不翻译直接用英文。)是c#中独有的一种机制,可以理解成私有成员(字段field)的访问器。

event,事件。事件驱动不知道你听说过没,如果进行人机交互,用户干了什么程序要设法知道和捕捉,那么这个事件就是你干了什么的一个抽象,比如,单击鼠标左键就是一个事件。

deleget,委托。就是c++中的函数指针,只是类型安全的。或者你可以理解成它就是一个方法的别名,而且它可以绑定到不同的方法只要规格一致(即参数类型个数,返回值) 封装

在C#中可使用类来达到数据封装的效果,这样就可以使数据与方法封装成单一元素,以便于通过方法存取数据。除此之外,还可以控制数据的存取方式。

面向对象程序设计中一般以类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单位。在设计类时,不希望直接存取类中的数据,而是希望通过方法来存取数据。如此就可以达到封装数据的目的,方便以后维护、升级,也可以在操作数据时多一层判断,提高安全性。

封装还可以解决数据存取权限问题,使用封装可以将数据隐藏起来,形成一个封闭的空间,用户可以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用。如果一个类中包含敏感数据,则有些用户可以访问,有些用户却不能访问。如果不对这些数据的访问加以限制,那么后果是很严重的。所以,在编写程序时,要对类的成员使用不同的访问修饰符,从而定义它们的访问级别。

继承

继承是OOP最重要的特性之一。任何类都可以从另外一个类继承,即这个类拥有它所继承类的所有成员。在OOP中,被继承的类称为父类或基类。C# 提供了类的继承机制,但C# 只支持单继承,不支持多重继承,即在C# 中一次只允许继承一个类,不能同时继承多个类。

利用继承机制,用户可以通过增加、修改或替换类中方法对这个类进行扩充,以适应不同的应用要求。利用继承,程序开发人员可以在已有类的基础上构造新类。继承使得类支持分类的概念。在日常生活中很多东西比较有条理,那是因为它们有着很好的层次分类。如果不用层次分类,则要对每个对象定义其所有的性质。使用继承后,每个对象就可以只定义自己的特殊性质。每一层的对象只需定义本身的性质,其他性质可以从上一层继承下来。

在C# 中,接口允许多继承,可以通过继承多个接口来实现类似于C++中的多重继承。

在继承一个基类时,成员的可访问性是一个重要的问题。子类不能访问基类的私有成员,但是可以访问其公共成员。子类和外部代码都可以访问公共成员。这就是说,只使用这两个可访问性,就可以让一个成员被基类和子类访问,同时也可以被外部的代码访问。

为了解决这个问题,C# 还提供了第3种可访问性:protected。只有派生类才能访问protected成员,基类和外部代码都不能访问protected成员。

除了成员的保护级别外,用户还可以为成员定义其继承行为。基类的成员可以是虚拟的,成员可以由继承它的类重写。子类可以提供成员的其他执行代码。这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问它们。如果没有提供其他执行方式,外部代码就访问基类中成员的执行代码。

虚拟成员不能是私有成员,因为成员不能同时由子类重写,也不能访问它。基类还可以定义为抽象类。抽象类不能直接实例化,要使用抽象类就必须继承这个类,然后再实例化。

接口

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

(责任编辑:IT教学网)

更多

推荐MYSQL文章