| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1046 人关注过本帖
标题:分享]C#中的索引器[转]
只看楼主 加入收藏
冰封谷主
Rank: 4
等 级:贵宾
威 望:10
帖 子:226
专家分:20
注 册:2005-1-7
收藏
 问题点数:0 回复次数:5 
分享]C#中的索引器[转]
[分享]C#中的索引器 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访问函数,这样任何设置属性的尝试都会产生编译错误。 采用索引器的益处 说了半天咱们转到正题上来,那么为什么我要兜这个圈子呢?其实,这是因为类的索引器非常像属性,从代码上看也是这样。以下是具有索引器的类示例,通过索引器会返回一个字符串: 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访问函数。 以上就是有关索引器的一些基本概述了。现在你应该对索引器在你的开发中所具有的作用有了较深入的了解。
搜索更多相关主题的帖子: 索引 分享 
2005-04-07 14:43
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 
提问:直接设置读取firstname(改成public)与get 、set属性有什么区别
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);

程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-07 15:49
幻风幻云
Rank: 1
等 级:新手上路
帖 子:762
专家分:0
注 册:2005-1-14
收藏
得分:0 
使用属性可以保护私有成员

2005-04-07 15:52
charlia
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-3-28
收藏
得分:0 
关于索引能不能多讲一点啊~~????
2005-04-07 19:58
独孤追梦
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-3-18
收藏
得分:0 
索引
索引(indexer)是使得对象可以像数组一样被索引的成员。然而属性使类似域的访问变得可能,索引使得类似数组的访问变得可能。
作为一个例子,考虑前面给出的类Stack。这个类会需要执行类似数组的访问,所以可能会不通过执行不需要的Push和Pop操作而检查或改变堆栈中的项目。Stack的构造像个列表,但是需要提供方便的数组存取。
索引的声明类似于属性的声明,最大的不同在于索引是无名的(由于this是被索引,所以用于声明中的名称是this)而且索引包含索引参数。索引参数在方括号中提供。例子
using System;
public class Stack
{
 private Node GetNode(int index) {
  Node temp = first;
  while (index > 0) {
   temp = temp.Next;
   index--;
  }
  return temp;
 }
 public object this[int index] {
  get {
   if (!ValidIndex(index))
    throw new Exception("Index out of range.");
   else
    return GetNode(index).Value;
  }
  set {
   if (!ValidIndex(index))
    throw new Exception("Index out of range.");
   else
    GetNode(index).Value = value;
  }
 }
 ...
}
class Test
{
 static void Main() {
  Stack s = new Stack();
  s.Push(1);
  s.Push(2);
  s.Push(3);
  s[0] = 33; // Changes the top item from 3 to 33
  s[1] = 22; // Changes the middle item from 2 to 22
  s[2] = 11; // Changes the bottom item from 1 to 11
 }
}
介绍了一个Stack中的索引
2005-04-10 13:17
梦幻情缘
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:769
专家分:20
注 册:2005-4-4
收藏
得分:0 
讲得好呀!以后能不能多了一点呀!
2005-04-10 14:43
快速回复:分享]C#中的索引器[转]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015226 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved