C#面向對象--索引器


  一、索引器(Indexer)允許類和結構的實例像數組一樣通過索引取值,可以看做是對[]運算符的重載,索引器實際上就是有參數的屬性,也被稱為有參屬性或索引化屬性,其聲明形式與屬性相似,不同之處在於索引器的訪問器需要傳入參數;
  1.聲明索引器:

class MyClass
{
    string[] myArray = new string[100];
    public string this[int index] //使用關鍵字this定義索引器
    {
        get
        {
            return myArray[index];
        }
        set
        {
            myArray[index] = value;
        }
    }
}
//使用索引器:
MyClass myClass = new MyClass();
myClass[0] = "1";
Console.WriteLine(myClass[0]); //1

  ※屬性和索引器都不被當作變量,二者都是在基於方法實現的,因此無法將屬性或索引器作為引用參數、引用返回值、引用局部變量來傳遞和使用;

  ※索引器只能聲明為實例成員,不能聲明為靜態的;

  ※索引器不支持自動實現;

  ※索引器只是在調用的寫法上與數組相同,但實現原理與數組完全不同,二者不可混淆;

  2.聲明泛型版本的索引器:

class MyClass<T>
{
    private T[] myArray = new T[100];
    public T this[int index]
    {
        get
        {
            return myArray[index];
        }
        set
        {
            myArray[index] = value;
        }
    }
}
//使用索引器:
MyClass<string> myClass = new MyClass<string>();
myClass[0] = "1";
Console.WriteLine(myClass[0]); //1

  3.索引器不僅可以根據整數進行索引,還可以根據任何類型進行索引,同時索引器也支持重載,類似於方法的重載,需要參數列表不完全相同,例如:

public int this[string content]
{
    get
    {
        return Array.IndexOf(myArray, content);
    }
}

  4.索引器同時也支持參數列表有多個參數,類似於使用多維數組,例如:

string[,] myArray = new string[100, 100];
public string this[int posX, int posY]
{
    get
    {
        return myArray[posX, posY];
    }
    set
    {
        myArray[posX, posY] = value;
    }
}
//使用索引器:
MyClass myClass = new MyClass();
myClass[0, 0] = "1";
Console.WriteLine(myClass[0, 0]); //1

  二、索引器實際上就是有參數的屬性,其屬性名固定為Item,通過反射獲取MyClass的屬性信息數組即可看到:

Type myType = typeof(MyClass);
PropertyInfo[] myProperties = myType.GetProperties();
for (int i = 0; i < myProperties.Length; i++)
{
    Console.WriteLine(myProperties[i].Name); //Item
}

  1.通過反射調用索引器獲取值:

MyClass myClass = new MyClass();
for (int i = 0; i < 100; i++)
{
    myClass[i] = i.ToString();
}
PropertyInfo data = myType.GetProperty("Item");
//如果索引器包含重載,例如上面this[string content]的例子,那么使用GetProperty的重載方法傳入參數列表的類型數組來獲取指定索引器myType.GetProperty("Item", new Type[] { typeof(int) })
string myStr = (string)data.GetValue(myClass, new object[] { 5 }); //第二個參數即索引器參數
Console.WriteLine(myStr); //5

  2.查看其IL代碼:

 

  


如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!

作者:Minotauros
出處:https://www.cnblogs.com/minotauros/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM