溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中索引器的詳細介紹

發(fā)布時間:2020-05-08 13:40:48 來源:億速云 閱讀:338 作者:Leah 欄目:編程語言

今天小編就為大家?guī)硪黄狢#中索引器的詳細介紹的文章。小編覺得挺不錯的,為此分享給大家做個參考。一起跟隨小編過來看看吧。

索引器(Indexer)是C#引入的一個新型的類成員,它使得類中的對象可以像數(shù)組那樣方便、直觀的被引用。索引器非常類似于屬性,但索引器可以有參數(shù)列表,且只能作用在實例對象上,而不能在類上直接作用。定義了索引器的類可以讓您像訪問數(shù)組一樣的使用 [ ] 運算符訪問類的成員。(當(dāng)然高級的應(yīng)用還有很多,比如說可以把數(shù)組通過索引器映射出去等等)

索引器允許類或結(jié)構(gòu)的實例就像數(shù)組一樣進行索引。索引器類似于屬性,不同之處在于它們的取值函數(shù)采用參數(shù)。索引器允許類或者結(jié)構(gòu)的實例按照與數(shù)組相同的方式進行索引取值,索引器與屬性類似,不同的是索引器的訪問是帶參的。

索引器概述

  • 使用索引器可以用類似于數(shù)組的方式為對象建立索引。

  • get 取值函數(shù)返回值。 set 取值函數(shù)分配值。

  • this 關(guān)鍵字用于定義索引器。

  • value 關(guān)鍵字用于定義由 set 索引器分配的值。

  • 索引器不必根據(jù)整數(shù)值進行索引;由你決定如何定義特定的查找機制。

  • 索引器可被重載。

  • 索引器可以有多個形參,例如當(dāng)訪問二維數(shù)組時。

索引器和數(shù)組比較:

(1)索引器的索引值(Index)類型不受限制

(2)索引器允許重載

(3)索引器不是一個變量

索引器和屬性的不同點

(1)屬性以名稱來標識,索引器以函數(shù)形式標識

(2)索引器可以被重載,屬性不可以

(3)索引器不能聲明為static,屬性可以

一個簡單的索引器例子

using System;
using System.Collections;

public class IndexerClass
{
    private string[] name = new string[2];

    //索引器必須以this關(guān)鍵字定義,其實這個this就是類實例化之后的對象
    public string this[int index]
    {
        //實現(xiàn)索引器的get方法
        get
        {
            if (index < 2)
            {
                return name[index];
            }
            return null;
        }

        //實現(xiàn)索引器的set方法
        set
        {
            if (index < 2)
            {
                name[index] = value;
            }
        }
    }
}
public class Test
{
    static void Main()
    {
        //索引器的使用
        IndexerClass Indexer = new IndexerClass();
        //“=”號右邊對索引器賦值,其實就是調(diào)用其set方法
        Indexer[0] = "張三";
       Indexer[1] = "李四";
        //輸出索引器的值,其實就是調(diào)用其get方法
        Console.WriteLine(Indexer[0]);
       Console.WriteLine(Indexer[1]);
    }
}


以字符串作為下標,對索引器進行存取

public class IndexerClass
{
    //用string作為索引器下標的時候,要用Hashtable
    private Hashtable name = new Hashtable();

    //索引器必須以this關(guān)鍵字定義,其實這個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關(guān)鍵字:C#規(guī)定,實例化一個類或者調(diào)用類的構(gòu)造函數(shù)時,必須使用new關(guān)鍵
            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);
        }
    }
}

看完上訴內(nèi)容,你們對C#中的索引器大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI