2009-03-04 44 views

回答

8

您可以將索引器視爲具有參數的屬性。 你用這個參數做什麼取決於你。

一般來說,索引器用於提供,以及索引您的對象是有意義的。例如,如果您的對象處理項目集合,可以使用簡單的'[]'語法來訪問它們是有意義的,因爲可以很容易地將它想象爲一個數組,我們可以根據這個數組將對象的位置賦予我們想要的位置返回。

前段時間我寫了一篇關於indexers using reflection方面的博客文章。
一個我給的例子是:

using System; 
using System.Collections; 

public class DayPlanner 
{ 
    // We store our indexer values in here 
    Hashtable _meetings = new System.Collections.Hashtable(); 

    // First indexer 
    public string this[DateTime date] { 
     get { 
      return _meetings[date] as string; 
     } 
     set { 
      _meetings[date] = value; 
     } 
    } 

    // Second indexer, overloads the first 
    public string this[string datestr] { 
     get { 
      return this[DateTime.Parse(datestr)] as string; 
     } 
     set { 
      this[DateTime.Parse(datestr)] = value; 
     } 
    } 
} 

然後你可以使用這樣的:

DayPlanner myDay = new DayPlanner(); 
    myDay[DateTime.Parse("2006/02/03")] = "Lunch"; 
    ... 
    string whatNow = myDay["2006/06/26"]; 

這只是表明你可以扭轉一個索引的目的,做你想做什麼。
並不意味着你應該儘管... :-)

0

.NET中的任何集合,無論它們是ArrayLists還是泛型列表,在它們的基礎結構中都有幕後數組。索引器只是一種改變常規數組索引工作方式的方法,無論是通過接受字符串作爲輸入來查找具有該屬性的相應對象或其他輸入。但是,再次,在所有語法糖的下面,它仍然以數組的表示結束。

This article might help explain how custom indexers are made

關於第二點,Enums是整數。如果您需要枚舉的字符表示,則僅限於字符串操作,或者您可以使用decorate your enums with appropriate attributes以便它們發出所需的字符串或字符表示形式。

1

索引器允許類或結構的實例像數組一樣被索引,它們最常實現在其主要目的是封裝內部集合的類型中或數組。

get訪問返回一個值和一組訪問分配一個值:

public T this[int i] 
{ 
    get 
    { 
     return arr[i]; 
    } 
    set 
    { 
     arr[i] = value; 
    } 
} 

隨着枚舉,它們定義的值被限制爲一小部分原始積分類型(字節,爲sbyte,短,USHORT的,int,uint,long,ulong)。

char類型也是一種整數類型,但它會從其他整型在兩個方面有所不同:

  • 還有其他類型char類型的隱式轉換。特別是,即使sbyte,byte和ushort類型的值的範圍可以使用char類型完全表示,但不存在從sbyte,byte或ushort到char的隱式轉換。

  • 字符類型的常量必須寫成字符文字或整數文字與轉換類型結合使用char。例如,(char)10與'\ x000A'相同。

C# Language Specification 3.0, Section 4.1.5

1

索引器的目的就是,它就像一個數組,但你指定當您從讀取和寫入索引發生了什麼代碼。

索引器可以做任何事情來提供像behviour的集合。通常有一些私人收藏可供您使用索引器進行讀取或讀取/寫入訪問。

枚舉不能使用字符,因爲它的基本類型,但可以使用字符文字指定一個整數值:

public enum Characters : int { 
    Alpha = 'a', 
    Beta = 'b' 
} 

Characters.Alpha的值將97和Characters.Alpha.ToString( )將返回字符串「Alpha」。 (char)Characters.Alpha給出值'a'。