C#中索引器和屬性的區別
阿新 • • 發佈:2019-02-12
索引器允許類或者結構的例項按照與陣列相同的方式進行索引取值,索引器與屬性類似,不同的是索引器的訪問是帶參的。
索引器和陣列比較:
(1)索引器的索引值(Index)型別不受限制
(2)索引器允許過載
(3)索引器不是一個變數
索引器和屬性的不同點
(1)屬性以名稱來標識,索引器以函式形式標識
(2)索引器可以被過載,屬性不可以
(3)索引器不能宣告為static,屬性可以
一個簡單的索引器例子
using System; using System.Collections; public class IndexerClass { private string[] name = new string[2]; //索引器必須以this關鍵字定義,其實這個this就是類例項化之後的物件 public string this[int index] { //實現索引器的get方法 get { if (index < 2) { return name[index]; } return null; } //實現索引器的set方法 set { if (index < 2) { name[index] = value; } } } } public class Test { static void Main() { //索引器的使用 IndexerClass Indexer = new IndexerClass(); //“=”號右邊對索引器賦值,其實就是呼叫其set方法 Indexer[0] = "張三"; Indexer[1] = "李四"; //輸出索引器的值,其實就是呼叫其get方法 Console.WriteLine(Indexer[0]); Console.WriteLine(Indexer[1]); } }
以字串作為下標,對索引器進行存取
public class IndexerClass { //用string作為索引器下標的時候,要用Hashtable private Hashtable name = new Hashtable(); //索引器必須以this關鍵字定義,其實這個this就是類例項化之後的物件 public string this[string index] { get { return name[index].ToString(); set { name.Add(index, value); } } } public class Test { static void Main() { IndexerClass Indexer = new IndexerClass(); Indexer["A0001"] = "張三"; Indexer["A0002"] = "李四"; Console.WriteLine(Indexer["A0001"]); Console.WriteLine(Indexer["A0002"]); } }
索引器的過載
public class IndexerClass { private Hashtable name = new Hashtable(); //1:通過key存取Values public string this[int index] { get { return name[index].ToString(); } set { name.Add(index, value); } } //2:通過Values存取key public int this[string aName] { get { //Hashtable中實際存放的是DictionaryEntry(字典)型別,如果要遍歷一個Hashtable,就需要使用到DictionaryEntry foreach(DictionaryEntry d in name) { if (d.Value.ToString() == aName) { return Convert.ToInt32(d.Key); } } return -1; } set { name.Add(value, aName); } } } public class Test { static void Main() { IndexerClass Indexer = new IndexerClass(); //第一種索引器的使用 Indexer[1] = "張三";//set訪問器的使用 Indexer[2] = "李四"; Console.WriteLine("編號為1的名字:" + Indexer[1]);//get訪問器的使用 Console.WriteLine("編號為2的名字:" + Indexer[2]); Console.WriteLine(); //第二種索引器的使用 Console.WriteLine("張三的編號是:" + Indexer["張三"]);//get訪問器的使用 Console.WriteLine("李四的編號是:" + Indexer["李四"]); Indexer["王五"] = 3;//set訪問器的使用 Console.WriteLine("王五的編號是:" + Indexer["王五"]); } }
多參索引器
using System;
using System.Collections;
//入職資訊類
public class EntrantInfo
{
//姓名、編號、部門
private string name;
private int number;
private string department;
public EntrantInfo()
{
}
public EntrantInfo(string name, int num, string department)
{
this.name = name;
this.number = num;
this.department = department;
}
public string Name
{
get { return name; }
set { name = value; }
}
public int Num
{
get { return number; }
set { number = value; }
}
public string Department
{
get { return department; }
set { department = value; }
}
}
//宣告一個類EntrantInfo的索引器
public class IndexerForEntrantInfo
{
private ArrayList ArrLst;//用於存放EntrantInfo類
public IndexerForEntrantInfo()
{
ArrLst = new ArrayList();
}
//宣告一個索引器:以名字和編號查詢存取部門資訊
public string this[string name, int num]
{
get
{
foreach (EntrantInfo en in ArrLst)
{
if (en.Name == name && en.Num == num)
{
return en.Department;
}
}
return null;
}
set
{
//new關鍵字:C#規定,例項化一個類或者呼叫類的建構函式時,必須使用new關鍵
ArrLst.Add(new EntrantInfo(name, num, value));
}
}
//宣告一個索引器:以編號查詢名字和部門
public ArrayList this[int num]
{
get
{
ArrayList temp = new ArrayList();
foreach (EntrantInfo en in ArrLst)
{
if (en.Num == num)
{
temp.Add(en);
}
}
return temp;
}
}
//還可以宣告多個版本的索引器...
}
public class Test
{
static void Main()
{
IndexerForEntrantInfo Info = new IndexerForEntrantInfo();
//this[string name, int num]的使用
Info["張三", 101] = "人事部";
Info["李四", 102] = "行政部";
Console.WriteLine(Info["張三", 101]);
Console.WriteLine(Info["李四", 102]);
Console.WriteLine();
//this[int num]的使用
foreach (EntrantInfo en in Info[102])
{
Console.WriteLine(en.Name);
Console.WriteLine(en.Department);
}
}
}