1. 程式人生 > 實用技巧 >學習c#(第8天):c#中的索引器(一種實用方法)

學習c#(第8天):c#中的索引器(一種實用方法)

表的內容 目錄介紹c#中的索引器(定義)路線圖索引器(解釋) 實驗一,實驗二,實驗三 資料型別在索引器 實驗室1 介面中的索引器抽象類中的索引器索引器過載 點要記住 靜態索引器? 點要記住 . net框架和索引器中的繼承/多型 點要記住 屬性vs索引器結論 介紹 在本系列的最後一篇文章中,我們學習了c#中的屬性。“深入探究OOP”系列的這篇文章將解釋關於c#中的索引器、它的使用和實際實現。我們將遵循同樣的學習方法,即少理論多實踐。我將試著深入地解釋這個概念。 c#中的索引器(定義) 讓我們從https://msdn.microsoft.com/en-us/library/6x16t2tx.aspx獲取定義, 索引器允許類或結構的例項像陣列一樣被索引。索引器重複屬性,除了它們的訪問器接受引數。” 路線圖 讓我們回顧一下我們的路線圖, 潛水在OOP(第一天):多型和繼承(早期繫結/編譯時多型)潛水在OOP(第二天):多型和繼承(繼承)潛水OOP(第三天):多型和繼承(動態繫結/執行時多型)潛水在OOP(第四天):多型和繼承(關於Abstarct類在c#中)潛水在OOP(第五天):都是用c#訪問修飾符(公共/私人/保護/內部/密封/常量/只讀的欄位)學習c#(6天):理解列舉在c#中(一個實際的方法)學習c#(7天):用c#屬性(一個實際的方法)學習c#(8天):用c#索引器(一個實際的方法)學習c#(9天):瞭解c#事件(Insight)學習c#(第十天):代表在c#中(一個實際的方法)學習c#(11天):c#事件(一個實際的方法) 索引器(解釋) 正如定義所說,索引器允許我們利用將類物件作為陣列訪問的能力。 為了更好地理解,建立一個名為Indexers的控制檯應用程式,並向其新增一個名為Indexer的類。我們將使用這個類和專案來學習索引器。使類公開,現在不新增任何程式碼,在Program.cs中新增以下程式碼, 實驗室1 隱藏,複製Code

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
            Indexer indexer=new Indexer();
            indexer[1] = 50;
        }
    }
}

編譯程式碼。我們得到, 不能用[]對'Indexers.Indexer'型別的表示式應用索引 我剛剛建立了Indexer類的一個物件,並試圖將該物件用作陣列。因為它實際上不是一個數組,所以導致了編譯時錯誤。 實驗室2 Indexer.cs 隱藏,複製Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexers
{
    public class Indexer
    {
        public int this[int indexValue]
        {
            set
            {
                Console.WriteLine("I am in set : Value is " + value + " and indexValue is "
+ indexValue); Console.ReadLine(); } } } }

Program.cs 隱藏,複製Code

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
            Indexer indexer=new Indexer();
            indexer[1] = 50;
        }
    }
}

輸出 這裡我們使用indexer來索引類indexer的物件。現在我的物件可以作為陣列來訪問不同的物件值。 索引器的實現來自一個名為“this”的屬性。它接受一個整型引數indexValue。索引器不同於屬性。在屬性中,當我們想要初始化或賦值時,會自動呼叫“set”訪問器(如果定義的話)。而“set”訪問器中的關鍵字“value”用於儲存或跟蹤分配給我們的屬性的值。在上面的例子中,索引器[1]= 50; 呼叫“this”屬性的“set”訪問器,即一個索引器,因此50成為值,1成為該值的索引。 實驗室3 Indexer.cs 隱藏,複製Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexers
{
    public class Indexer
    {
        public int this[int indexValue]
        {
            set
            {
                Console.WriteLine("I am in set : Value is " + value + " and indexValue is " + indexValue);
            }
             get
            {
                Console.WriteLine("I am in get and indexValue is " + indexValue);
                return 30;
            }
        }
    }
}

Program.cs 隱藏,複製Code

using System;

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
            Indexer indexer=new Indexer();
            Console.WriteLine(indexer[1]);
            Console.ReadKey();
        }
    }
}

輸出 在上面的程式碼片段中,我也使用get來訪問indexer的值。屬性和索引器在同一組規則上工作。我們在如何使用它們上有一點不同。當我們執行indexer[1]時,意味著呼叫“get”訪問器,當我們賦值給indexer[1]時,意味著呼叫“set”訪問器。在實現indexer程式碼時,我們必須注意,當我們訪問indexer時,它是以變數和陣列引數的形式訪問的。 資料型別在索引器 實驗室1 Indexer.cs 隱藏,複製Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexers
{
    public class Indexer
    {
        public int Index;
        public int this[string indexValue]
        {
            set
            {
                Console.WriteLine("I am in set : Value is " + value + " and indexValue is " + indexValue);
                Index = value;
            }
             get
            {
                Console.WriteLine("I am in get and indexValue is " + indexValue);
                return Index;
            }
        }
    }
}

Program.cs 隱藏,複製Code

using System;

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
            Indexer indexer=new Indexer();
            indexer["name"]=20;
            Console.WriteLine(indexer["name"]);
            Console.ReadKey();
        }
    }
}

輸出 “this”屬性,即索引器有返回值。在我們的示例中,返回值是整數。方括號和“this”也可以容納其他資料型別,而不僅僅是整數。在上面提到的例子中,我試圖用字串引數型別來解釋“this”:public int this[string indexValue], 字串引數“indexValue”有一個值“name”,就像我們在Program.cs的Main方法中傳遞的一樣。因此,一個類中可以有多個索引器來決定陣列的引數值的資料型別。與屬性一樣,索引器遵循同樣的繼承和多型性規則。 索引器的介面 與屬性和方法一樣,索引器也可以在介面中宣告。 在實際實現中,只需建立一個名為IIndexers的介面,其中包含以下程式碼, 隱藏,複製Code

namespace Indexers
{
    interface IIndexers
    {
        string this[int indexerValue] { get; set; }
    }
}

在這裡,一個索引器是用一個空的獲取和設定宣告訪問器,返回字串值。 現在我們需要一個類來實現這個介面。您可以定義一個類的選擇和實現,通過IIndexers介面, Indexer.cs 隱藏,複製Code

using System;

namespace Indexers
{
    public class IndexerClass:IIndexers
    {
        readonly string[] _nameList = { "AKhil","Bob","Shawn","Sandra" };

        public string this[int indexerValue]
        {
            get
            {
                return _nameList[indexerValue];
            }
            set
            {
                _nameList[indexerValue] = value;
            }
        }
    }
}

類都有一個預設的字串陣列名稱。現在我們可以在這個類來實現介面定義索引器獲取寫我們自定義的邏輯名稱indexerValue的基礎上。我們叫它在我們的主要方法, Program.cs 隱藏,複製Code

using System;

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
           IIndexers iIndexer=new IndexerClass();
            Console.WriteLine(iIndexer[0]);
            Console.WriteLine(iIndexer[1]);
            Console.WriteLine(iIndexer[2]);
            Console.WriteLine(iIndexer[3]);
            Console.ReadLine();

        }
    }
}

執行應用程式。輸出, 在主方法中,我們把IndexerClass介面來建立一個物件的引用,我們訪問物件陣列通過索引值陣列。它給的名字。 現在如果我想訪問“套”訪問,我可以很容易地做到這一點。檢查這個,只是新增兩行,你在索引器設定值, 隱藏,複製Code

iIndexer[2] = "Akhil Mittal";
Console.WriteLine(iIndexer[2]);

我2號元素的值設定為一個新名字,讓我們看看輸出, 索引器在抽象類 就像我們使用索引器介面,我們也可以在抽象類中使用索引器。我將使用相同的邏輯我們使用的原始碼介面,這樣你可以在抽象類與它是如何工作的。僅定義一個新類,抽象和應該包含一個抽象的索引器與空的獲取和設定, AbstractBaseClass 隱藏,複製Code

namespace Indexers
{
    public abstract class AbstractBaseClass
    {
        public abstract string this[int indexerValue] { get; set; }
    }
}

定義派生類,繼承抽象類, IndexerClass 我們這裡使用覆蓋在索引器覆蓋文摘索引器中宣告抽象類。 隱藏,複製Code

using System;

namespace Indexers
{
    public class IndexerClass:AbstractBaseClass
    {
        readonly string[] _nameList = { "AKhil","Bob","Shawn","Sandra" };

        public override string this[int indexerValue]
        {
            get
            {
                return _nameList[indexerValue];
            }
            set
            {
                _nameList[indexerValue] = value;
            }
        }
    }
}

Program.cs 我們將使用抽象類來建立一個物件的引用的索引器類。 隱藏,複製Code

using System;

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
           AbstractBaseClass absIndexer=new IndexerClass();
            Console.WriteLine(absIndexer[0]);
            Console.WriteLine(absIndexer[1]);
            Console.WriteLine(absIndexer[2]);
            Console.WriteLine(absIndexer[3]);
            absIndexer[2] = "Akhil Mittal";
            Console.WriteLine(absIndexer[2]);

            Console.ReadLine();

        }
    }
}

輸出: 上面的程式碼是自解釋的。你可以自己探索更多的場景更詳細的理解。 索引器過載 Indexer.cs 隱藏,收縮,複製Code

using System;

namespace Indexers
{
    public class Indexer
    {
        public int this[int indexerValue]
        {
            set
            {
                Console.WriteLine("Integer value " + indexerValue + " " + value);
            }
        }

        public int this[string indexerValue]
        {
            set
            {
                Console.WriteLine("String value " + indexerValue + " " + value);
            }
        }

        public int this[string indexerValue, int indexerintValue]
        {
            set
            {
                Console.WriteLine("String and integer value " + indexerValue + " " + indexerintValue + " " + value);
            }
        }
    }
}

Program.cs 隱藏,複製Code

using System;

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
            Indexer indexer=new Indexer();
            indexer[1] = 30;
            indexer["name"]=20;
            indexer["address",2] = 40;
            Console.ReadLine();
        }
    }
}

輸出 在上面的示例中,我們看到一個索引器的簽名在實際計算的實際引數和資料型別irresepective引數的名稱/索引器的引數或返回值。這讓我們像我們在方法過載超載索引器。你可以閱讀更多關於方法載入在http://www.codeproject.com/Articles/771455/Diving-in-OOP-Day-Polymorphism-and-Inheritance-Ear。現在我們有過載分度器,整數,整數字符串和字串組合作為實際引數。這樣的方法不能被過載的返回型別的基礎上,所以分度器遵循相同的方法做過載的方法。 點要記住 索引器一樣,我們不能過載特性。屬性更像是知道的名字和索引器另一方面更像是知道簽名。 靜態索引器? 在這個例子中,我們在最後一節中,討論靜態關鍵字新增到索引器的簽名, 隱藏,複製Code

public static int this[int indexerValue]
  {
      set
      {
          Console.WriteLine("Integer value " + indexerValue + " " + value);
      }
  }

編譯程式;我們得到一個編譯時錯誤, 錯誤的修飾符“靜態”是無效的條目 錯誤顯然表明一個索引器不能被標記為靜態的。一個索引器只能一個類例項成員而不是靜態的,另一方面羽根屬性也可以是靜態的。 點要記住 屬性可以是靜態的,但索引器不能。 在索引器繼承和多型性 Indexer.cs 隱藏,收縮,複製Code

using System;

namespace Indexers
{
    public class IndexerBaseClass
    {
        public virtual int this[int indexerValue]
        {
            get
            {
                Console.WriteLine("Get of IndexerBaseClass; indexer value: " + indexerValue);
                return 100;
            }
            set
            {
                Console.WriteLine("Set of IndexerBaseClass; indexer value: " + indexerValue + " set value " + value);
            }

        }
    }
    public class IndexerDerivedClass:IndexerBaseClass
    {
        public override int this[int indexerValue]
        {
            get
            {
                int dValue = base[indexerValue];
                Console.WriteLine("Get of IndexerDerivedClass; indexer value: " + indexerValue + " dValue from base class indexer: " + dValue);
                return 500;
            }
            set
            {
                Console.WriteLine("Set of IndexerDerivedClass; indexer value: " + indexerValue + " set value " + value);
                base[indexerValue] = value;
            }

        }
    }
}

Program.cs 隱藏,複製Code

using System;

namespace Indexers
{
    class Program
    {
        static void Main(string[] args)
        {
            IndexerDerivedClass indexDerived=new IndexerDerivedClass();
            indexDerived[2] = 300;
            Console.WriteLine(indexDerived[2]);
            Console.ReadLine();

        }
    }
}

輸出 上面的示例程式碼解釋了在索引器執行時多型和繼承。我建立了一個名為IndexerBaseClass擁有一個索引器的基類有自己的獲取和設定就像我們之前討論的例子。之後有一個名叫IndexerDerivedClass建立派生類,這來源於IndexerBaseClass覆蓋”這種“從基類索引器,注意,基類索引器是虛擬的,所以我們可以在派生類重寫它標誌著它在派生類“覆蓋”。這個例子使呼叫索引器的基類。有時候我們需要在派生類的派生類重寫程式碼,我們可能需要基類索引器應該被稱為第一。這只是一個情況。執行時多型的相同規則適用於這裡,我們宣告索引器和虛擬基類和派生類重寫。在“設定”訪問派生類,我們可以呼叫基類索引器作為基礎[indexerValue]。也使用這個值來初始化派生類索引器。值是儲存在“價值”關鍵字。所以,indexDerived [2] Program.cs被取代了Main()方法的基礎[2]在“設定”訪問器。而在“獲得”訪問器亦然,我們需要把基礎(indexerValue)等號的右手邊。基類中的“獲得”訪問器返回一個值,即100,我們得到在dValue變數。 net框架和索引器 索引器在。net框架中起到至關重要的作用。索引器廣泛應用於。net框架內建類,圖書館收藏和enumerab等勒。索引器使用可搜尋的集合就像字典,散列表,列表,Arraylist等等。 點要記住 字典在c#中主要使用索引器盯著引數作為一個索引器引數。 內部類陣列列表和列表使用索引器提供的功能為獲取和使用元素陣列。 屬性和索引器 我已經解釋了很多關於屬性和索引器,總而言之,讓我點為更好地理解一個MSDN的連結, PropertyIndexerAllows方法被當作公共資料成員。允許內部物件的集合的元素被使用陣列訪問符號物件本身。通過一個簡單的名字。通過索引訪問。可以是靜態或例項成員。必須是類的一個例項member.A get屬性的訪問器沒有parameters.A get訪問器的索引器都具有相同的形式引數列表indexer.A set屬性的訪問器包含implicit value parameter.A set訪問器的索引器都具有相同的形式引數列表索引器,並從而值引數。支援語法with縮短;自動實現屬性(c#程式設計指南)。不支援縮短語法。 表從MSDN: https://msdn.microsoft.com/en-us/library/4bsztef7.aspx 結論 在本文中我們完成了幾乎所有的場景相關的索引器。我們實驗室做了很多實踐明確概念。我希望我的讀者現在用心瞭解這些基本概念和永遠不會忘記他們。這些也可以幫助你在c#採訪。 保持編碼和享受閱讀 也不要忘記評價/評論/喜歡我的文章,如果以任何方式幫助你,這有助於我得到激勵,鼓勵我寫的越來越多。 我的其他系列文章: MVC: http://www.codeproject.com/Articles/620195/Learning-MVC-Part-Introduction-to-MVC-Architectu RESTful webapi: http://www.codeproject.com/Articles/990492/RESTful-Day-sharp-Enterprise-Level-Application 編碼快樂! 本文轉載於:http://www.diyabc.com/frontweb/news1972.html