分类: C/C++
2009-09-29 09:54:15
作为初学进看到上述描述时可能还是比较疑惑其作用与用法,其实在理解属性后再理解索引器相对较容易。MSDN中关于属性的解释是这样的:属性是这样的成员:它们提供灵活的机制来读取、编写或计算私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称为“访问器”的特殊方法。这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性。
下面的例子定义一个Person类,其中私有字段name和age的读写就是通过属性来完成的,其实Age属性还可以完成取值过滤功能:
using System; using System.Collections.Generic; using System.Text; namespace Demo { class Person { private string name; public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { if (age < 0 || age > 100) age = 0; else age = value; } } } }
上例中的字段成员如果是一个数组或集合时,封装为属性时可能就相对麻烦,此时索引器的功能便派上用场,例:
using System; using System.Collections.Generic; using System.Text; namespace Demo { class Program { static void Main(string[] args) { IndexerClass test = new IndexerClass(); //使用索引器赋值功能 test[0] = 24; test[1] = 56; test[2] = 55; test[3] = 98; for (int i = 0; i <= 3; i++) { //使用索引器读取功能 Console.WriteLine("元素{0}的值是{1}", i, test[i]); } Console.ReadLine(); } } class IndexerClass { //定义私有数组 private int[] arr = new int[100]; //定义公开索引器成员,用于访问 私有数组 public int this[int index] { //定义可以读 get { if (index < 0 || index >= 100) return 0; else return arr[index]; } //定义可写 set { if (!(index < 0 || index >= 100)) arr[index] = value; } } } }
另:索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。见下例:
using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace Demo { class Program { static void Main(string[] args) { Product p = new Product(); Console.WriteLine("计算机的价格是:{0}", p["计算机"]); Console.ReadLine(); } } class Product { //定义私有Hashtable存储产品名称与价格 private Hashtable products = new Hashtable(); //构造函数中初始化Hashtable数据 public Product() { products.Add("计算机", 6800.00m); products.Add("手机", 2900.00m); products.Add("PSP", 1500.00m); } //定义索引器使用字符型产品名 public decimal this[string key] { get { return Convert.ToDecimal(products[key]); } set { products[key] = value; } } } }