程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 使用C#索引器

使用C#索引器

編輯:關於C#

索引器在語法上方便您創建 客戶端應用程序可將其作為數組訪問的類、結構或接口。索引器經常是在主要用 於封裝內部集合或數組的類型中實現的。例如,假定具有一個名為TempRecord的 類,此類表示在24小時內的10個不同時間記錄的華氏度。此類包含一個表示溫度 的float類型的名為“temps”的數組和表示記錄溫度的日期的 DateTime。通過在此類中實現一個索引器,客戶端可以通過floattemp=tr[4]而 不是floattemp=tr.temps[4]語法訪問TempRecord實例中的溫度。索引器表示法 不僅簡化了客戶端應用程序的語法,還使其他開發人員能夠更加直觀地理解類及 其用途。

要聲明類或結構上的索引器,請使用this關鍵字,如下例所示 :

復制代碼

public int this[int index]    // Indexer declaration
{
// get and set accessors
}

備注

索引器類型及其參數類型必須至少如同索引器本身一樣是可 訪問的。有關可訪問級別的更多信息,請參見訪問修飾符。

有關如何對 接口使用索引器的更多信息,請參見接口索引器。

索引器的簽名由其形 參的數量和類型組成。它不包括索引器類型或形參名。如果在同一類中聲明一個 以上的索引器,則它們必須具有不同的簽名。

索引器值不屬於變量;因 此,不能將索引器值作為ref或out參數進行傳遞。

要為索引器提供一個 其他語言可以使用的名字,請使用聲明中的name屬性。例如:

復制代碼

[System.Runtime.CompilerServices.IndexerName("TheItem")]
public int this [int index] // Indexer declaration
{
}

此索引器將具有名稱 TheItem。不提供名稱屬性將生成Item默認名稱。

示例1

說明

下面的示例說明如何聲明私有數組字段、temps和索引器。使用索引器可 直接訪問實例tempRecord[i]。另一種使用索引器的方法是將數組聲明為public 成員並直接訪問它的成員tempRecord.temps[i]。

請注意,當計算索引器 的訪問時(例如,在Console.Write語句中),將調用get訪問器。因此,如果 get訪問器不存在,將發生編譯時錯誤。

代碼

C#復制代碼

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);
//}
}
}

使用其他值進行索引

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

可靠編程

提高索引器 的安全性和可靠性有兩種主要的方法:

確保結合某一類型的錯誤處理策 略,以處理萬一客戶端代碼傳入無效索引值的情況。在本主題前面的第一個示例 中,TempRecord類提供了Length屬性,使客戶端代碼能夠在將輸入傳遞給索引器 之前對其進行驗證。也可以將錯誤處理代碼放入索引器自身內部。確保為用戶記 錄在索引器的訪問器中引發的任何異常。有關更多信息,請參見異常設計准則。

應當為get和set訪問器的可訪問性設置盡可能多的限制。這一點對set訪問器尤為重要。有關更多信息,請參見非對稱訪問器可訪問性(C#編程指 南)。

http://www.cnblogs.com/moondiary/archive/2008/08/15/net.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved