Sdílet prostřednictvím


Použití indexerů (Průvodce programováním v C#)

Indexování jsou syntaktické pohodlí, které umožňují vytvářet třídy, struct, nebo rozhraní , stejně jako matice přístup klientských aplikací.Indexování jsou nejčastěji implementovány v typech, jehož primárním účelem je zapouzdření vnitřní kolekce nebo v matici.Předpokládejme například, že máte třídu s názvem TempRecord, představující teplota v Farenheit zaznamenané v 10 různých časech během 24 hodin.Třída obsahuje pole s názvem "temps" plováku typ představující teploty a DateTime , představuje datum, které byly zaznamenány teploty.Implementací indexovací člen v této třídě mohou klienti získat přístup teplot v instanci TempRecord jako float temp = tr[4] místo jako float temp = tr.temps[4].Zápis indexer pouze zjednodušuje syntaxi pro klientské aplikace; bude také třídy a jeho účelem jiným vývojářům pochopit intuitivnější.

Na třídě nebo struktuře deklarovat indexovací člen, použijte této klíčové slovo, jako v následujícím příkladu:

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

Poznámky

Typ indexovací člen a jeho parametry typu musí být přístupné jako službu indexování, sám.Další informace o úrovních usnadnění naleznete Modifikátory přístupu.

Další informace o indexování pomocí rozhraní, viz Indexování rozhraní.

Podpis indexovací člen obsahuje číslo a jeho formální parametry typů.Neobsahuje typ indexer nebo názvy formálních parametrů.Pokud deklarujete více indexovacího členu ve stejné třídě, musí mít různé podpisy.

Hodnotou indexování nejsou klasifikovány jako proměnné. proto nelze předat hodnotou indexovacího členu jako ref nebo mimo parametr.

Použijte název, který lze použít jiné jazyky poskytují službu indexování, name atribut v prohlášení.Příklad:

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

Tento indexovací člen bude mít název TheItem.Neposkytuje atribut názvu by provést Item výchozí název.

Příklad 1

Description

Následující příklad ukazuje, jak deklarovat soukromé pole pole, tempsa indexovací člen.Službu indexování umožňuje přímý přístup k instanci tempRecord[i].Alternativou k použití službu indexování je deklarovat pole jako veřejné členských a přístup k jeho členů, tempRecord.temps[i], přímo.

Všimněte si, že při přístupu indexování vyhodnocování, například v Console.Write prohlášení, získat přístupový objekt je vyvolána.Proto pokud ne get přístupový objekt existuje, dojde k chybě kompilace.

Kód

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

    // To enable client code to validate input  
    // when accessing your indexer. 
    public int Length
    {
        get { return temps.Length; }
    }
    // Indexer declaration. 
    // If index is out of range, the temps array will throw the exception. 
    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++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();

    }
}
/* Output:
        Element #0 = 56.2
        Element #1 = 56.7
        Element #2 = 56.5
        Element #3 = 58.3
        Element #4 = 58.8
        Element #5 = 60.1
        Element #6 = 65.9
        Element #7 = 62.1
        Element #8 = 59.2
        Element #9 = 57.5
    */

Indexování pomocí jiné hodnoty

C# neomezuje index typu celé číslo.Například může být vhodné použít řetězec s indexovací člen.Takové indexovací člen může být prováděna hledání řetězce v kolekci a vrácení odpovídající hodnotu.Jako přístupové objekty můžete přetíženy, můžete existovaly řetězec a celé číslo verze.

Příklad 2

Description

V tomto příkladu je deklarována třídy, který ukládá dny v týdnu.A get přístupový objekt je deklarována, která přebírá řetězec, název den a vrátí celé číslo odpovídající.Například neděle bude výsledkem 0, pondělí bude vrátit 1 atd.

Kód

// 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)
    {

        for (int j = 0; j < days.Length; j++)
        {
            if (days[j] == testDay)
            {
                return j;
            }
        }

        throw new System.ArgumentOutOfRangeException(testDay, "testDay must be in the form \"Sun\", \"Mon\", etc");
    }

    // 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"]);

        // Raises ArgumentOutOfRangeException
        System.Console.WriteLine(week["Made-up Day"]);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
// Output: 5

Robustní programování

Existují dva hlavní způsoby, v nichž můžete zlepšit zabezpečení a spolehlivost indexování:

  • Nezapomeňte zahrnout určitý typ strategie zpracování chyb zpracování pravděpodobnost Klientský kód předávání v hodnotě neplatný index.V prvním příkladu v tomto tématu třída TempRecord obsahuje vlastnost Length, ověřte před předáním na službu indexování vstupní kód klienta umožňuje.Můžete také vložit kód uvnitř indexeru, sama pro zpracování chyb.Přesvědčete se, zda dokument pro uživatele výjimky, které vyvolávají uvnitř přístupový objekt indexování.

  • Nastavit usnadnění přístupu get a set přístupové objekty omezující, je rozumné.To je důležité pro set přístupový objekt zejména.Další informace naleznete v tématu Omezení přístupnosti přistupujícího objektu (Průvodce programováním v C#).

Viz také

Referenční dokumentace

Indexery (Průvodce programováním v C#)

Vlastnosti (Průvodce programováním v C#)

Koncepty

Průvodce programováním v C#