C#中的索引器
2010-03-17 10:23
309 查看
原文地址:http://www.dingos.cn/index.php?topic=862.0
索引器是 C# 的简单组件;为数组创建索引器后,可以通过从类对象指定索引来直接访问数组元素;可以用索引数组的方式索引对象;可以像访问数组一样访问类的成员
定义索引器的规则
必须指定至少一个索引器参数
应当为索引器参数赋值
【索引器】
索引器允许类或结构的实例就像数组一样进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。
索引器在语法上方便您创建客户端应用程序可将其作为数组访问的类、结构或接口。索引器经常是在主要用于封装内部集合或数组的类型中实现的。
使用索引器可以用类似于数组的方式为对象建立索引。
get 访问器返回值。set 访问器分配值。
this 关键字用于定义索引器。
value 关键字用于定义由 set 索引器分配的值。
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
view plaincopy to clipboardprint?
public int this[int index]{ // 索引声明
// get 和 set访问器
}
注意:
索引器类型及其参数类型必须至少如同索引器本身一样是可访问的。
索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。
索引器值不属于变量;因此,不能将索引器值作为 ref 或 out 参数进行传递。
view plaincopy to clipboardprint?
class TempRecord
{
// Array of temperature values
private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F,
61.3F, 65.9F, 62.1F, 59.2F, 57.5F };
// Auto-Implemented Property
System.DateTime date { get; set; }
// To enable client code to validate input
// when accessing your indexer.
public int Length
{
get { return temps.Length; }
}
// Indexer declaration.
// Input parameter is validated by client
// code before being passed to the indexer.
public float this[int index]
{
get
{
return temps[index];
}
set
{
temps[index] = value;
}
}
}
class MainClass
{
static void Main()
{
TempRecord tempRecord = new TempRecord();
// Use the indexer's set accessor
tempRecord[3] = 58.3F;
tempRecord[5] = 60.1F;
// Use the indexer's get accessor
for (int i = 0; i < 10; i++)
{
// This example validates the input on the client side. You may
// choose to validate it in the class that implements the indexer, and throw an
// exception or return an error code in the case of invalid input.
if (i < tempRecord.Length)
{
System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);
}
else
{
System.Console.WriteLine("Index value of {0} is out of range", i);
}
}
//Uncomment this code to see how the .NET Framework handles indexer exceptions
//try
//{
// System.Console.WriteLine("Element #{0} = {1}", tempRecord[tempRecord.Length]);
//}
//catch (System.ArgumentOutOfRangeException e)
//{
// System.Console.WriteLine(e);
//}
}
}
定义索引器的步骤:
指定确定索引器可访问性的访问修饰符。
索引器(由get访问器返回)的返回类型。
this关键字(this在这里作为索引器的名称,而且必须用this)。
左括号后面是索引器的数据类型和标识符,接着是右方括号。
左大括号表示索引器主体的开始,在此出定义get和set访问器,这与定义属性一样,最后插入右大括号。
【属性和索引器之间的比较】
索引器与属性类似。除下表中显示的差别外,为属性访问器定义的所有规则同样适用于索引器访问器。
【索引器与数组的比较】
索引器不指向内存位置
索引器可以有非整数的下标(索引)
可以重载索引器
view plaincopy to clipboardprint?
using System.Collections;
class StrIndex{
public Hashtable studentList = new Hashtable();
public int this[string name]{
get{ return (int) studentList[name]; }
set{ studentList[name] = value; }
}
}
class Test{
static void Main(){
StrIndex objIndex = new StrIndex();
objIndex["Sam"] = 232676;
objIndex["Tom"] = 455464;
System.Console.WriteLine("Sam 的电话号码是 {0},Tom 的电话号码是 {1}",
objIndex["Sam"],objIndex["Tom"]);
}
}
索引器可以有非整数下标而数组不能有
【在索引器中使用多个参数】
view plaincopy to clipboardprint?
using System.Collections;
class IndexerExample{
public string[] stringList=new string[10];
public string this[int index]{
get{ return stringList[index]; }
set{ stringList[index] = value.ToString(); }
}
public Hashtable studentList = new Hashtable();
public int this[string number]{
get{ return (int) studentList[number]; }
set{ studentList[number] = value; }
}
}
class Test{
static void Main(){
IndexerExample indexTest = new IndexerExample();
indexTest.stringList[1]="Sam";
indexTest[2]="Tom";
indexTest["Sam"] = 232;
indexTest["Tom"] = 455;
}
}
索引器是 C# 的简单组件;为数组创建索引器后,可以通过从类对象指定索引来直接访问数组元素;可以用索引数组的方式索引对象;可以像访问数组一样访问类的成员
定义索引器的规则
必须指定至少一个索引器参数
应当为索引器参数赋值
【索引器】
索引器允许类或结构的实例就像数组一样进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。
索引器在语法上方便您创建客户端应用程序可将其作为数组访问的类、结构或接口。索引器经常是在主要用于封装内部集合或数组的类型中实现的。
使用索引器可以用类似于数组的方式为对象建立索引。
get 访问器返回值。set 访问器分配值。
this 关键字用于定义索引器。
value 关键字用于定义由 set 索引器分配的值。
索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
view plaincopy to clipboardprint?
public int this[int index]{ // 索引声明
// get 和 set访问器
}
注意:
索引器类型及其参数类型必须至少如同索引器本身一样是可访问的。
索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。
索引器值不属于变量;因此,不能将索引器值作为 ref 或 out 参数进行传递。
view plaincopy to clipboardprint?
class TempRecord
{
// Array of temperature values
private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F,
61.3F, 65.9F, 62.1F, 59.2F, 57.5F };
// Auto-Implemented Property
System.DateTime date { get; set; }
// To enable client code to validate input
// when accessing your indexer.
public int Length
{
get { return temps.Length; }
}
// Indexer declaration.
// Input parameter is validated by client
// code before being passed to the indexer.
public float this[int index]
{
get
{
return temps[index];
}
set
{
temps[index] = value;
}
}
}
class MainClass
{
static void Main()
{
TempRecord tempRecord = new TempRecord();
// Use the indexer's set accessor
tempRecord[3] = 58.3F;
tempRecord[5] = 60.1F;
// Use the indexer's get accessor
for (int i = 0; i < 10; i++)
{
// This example validates the input on the client side. You may
// choose to validate it in the class that implements the indexer, and throw an
// exception or return an error code in the case of invalid input.
if (i < tempRecord.Length)
{
System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);
}
else
{
System.Console.WriteLine("Index value of {0} is out of range", i);
}
}
//Uncomment this code to see how the .NET Framework handles indexer exceptions
//try
//{
// System.Console.WriteLine("Element #{0} = {1}", tempRecord[tempRecord.Length]);
//}
//catch (System.ArgumentOutOfRangeException e)
//{
// System.Console.WriteLine(e);
//}
}
}
定义索引器的步骤:
指定确定索引器可访问性的访问修饰符。
索引器(由get访问器返回)的返回类型。
this关键字(this在这里作为索引器的名称,而且必须用this)。
左括号后面是索引器的数据类型和标识符,接着是右方括号。
左大括号表示索引器主体的开始,在此出定义get和set访问器,这与定义属性一样,最后插入右大括号。
【属性和索引器之间的比较】
索引器与属性类似。除下表中显示的差别外,为属性访问器定义的所有规则同样适用于索引器访问器。
属性 | 索引器 |
允许像调用公共数据成员一样调用方法。 | 允许对一个对象本身使用数组表示法来访问该对象内部集合中的元素。 |
可通过简单的名称进行访问。 | 可通过索引器进行访问。 |
可以为静态成员或实例成员。 | 必须为实例成员。 |
属性的 get 访问器没有参数。 | 索引器的 get 访问器具有与索引器相同的形参表。 |
属性的 set 访问器包含隐式 value 参数。 | 除了值参数外,索引器的 set 访问器还具有与索引器相同的形参表。 |
支持对自动实现的属性使用短语法。 | 不支持短语法。 |
索引器不指向内存位置
索引器可以有非整数的下标(索引)
可以重载索引器
view plaincopy to clipboardprint?
using System.Collections;
class StrIndex{
public Hashtable studentList = new Hashtable();
public int this[string name]{
get{ return (int) studentList[name]; }
set{ studentList[name] = value; }
}
}
class Test{
static void Main(){
StrIndex objIndex = new StrIndex();
objIndex["Sam"] = 232676;
objIndex["Tom"] = 455464;
System.Console.WriteLine("Sam 的电话号码是 {0},Tom 的电话号码是 {1}",
objIndex["Sam"],objIndex["Tom"]);
}
}
索引器可以有非整数下标而数组不能有
【在索引器中使用多个参数】
view plaincopy to clipboardprint?
using System.Collections;
class IndexerExample{
public string[] stringList=new string[10];
public string this[int index]{
get{ return stringList[index]; }
set{ stringList[index] = value.ToString(); }
}
public Hashtable studentList = new Hashtable();
public int this[string number]{
get{ return (int) studentList[number]; }
set{ studentList[number] = value; }
}
}
class Test{
static void Main(){
IndexerExample indexTest = new IndexerExample();
indexTest.stringList[1]="Sam";
indexTest[2]="Tom";
indexTest["Sam"] = 232;
indexTest["Tom"] = 455;
}
}