Dizin oluşturucular kullanmaC# (Programlama Kılavuzu)Using indexers (C# Programming Guide)

Dizin oluşturucular, istemci uygulamaların yalnızca bir dizi olarak erişebileceği bir sınıf, Yapıveya arabirim oluşturmanıza imkan tanıyan sözdizimsel bir kolaydır.Indexers are a syntactic convenience that enable you to create a class, struct, or interface that client applications can access just as an array. Dizin oluşturucular en sık, birincil amacı bir iç koleksiyonu veya diziyi kapsüllemek olan türlerde uygulanır.Indexers are most frequently implemented in types whose primary purpose is to encapsulate an internal collection or array. Örneğin, 24 saatlik bir dönemde 10 farklı TempRecord zamanda kaydedildiği gibi Fahrenhayt 'teki sıcaklığı temsil eden bir sınıfınız olduğunu varsayalım.For example, suppose you have a class TempRecord that represents the temperature in Fahrenheit as recorded at 10 different times during a 24 hour period. Sınıfı, sıcaklık değerlerini depolamak temps için türünde float[] bir dizi içerir.The class contains an array temps of type float[] to store the temperature values. Bu sınıfta bir Dizin Oluşturucu uygulayarak istemciler, gibi bir TempRecord float temp = tr[4] örnekteki sıcakya farklı float temp = tr.temps[4]şekilde erişebilir.By implementing an indexer in this class, clients can access the temperatures in a TempRecord instance as float temp = tr[4] instead of as float temp = tr.temps[4]. Dizin Oluşturucu gösterimi yalnızca istemci uygulamaları için söz dizimini basitleştirir; Ayrıca, diğer geliştiricilerin anlayabilmesi için sınıfı ve amacını daha sezgisel hale getirir.The indexer notation not only simplifies the syntax for client applications; it also makes the class and its purpose more intuitive for other developers to understand.

Bir sınıf veya yapı biriminde bir Dizin Oluşturucu bildirmek için aşağıdaki örnekte gösterildiği gibi this anahtar sözcüğünü kullanın:To declare an indexer on a class or struct, use the this keyword, as the following example shows:

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

AçıklamalarRemarks

Bir dizin oluşturucunun türü ve parametrelerinin türü en az dizin oluşturucunun kendisi olarak erişilebilir olmalıdır.The type of an indexer and the type of its parameters must be at least as accessible as the indexer itself. Erişilebilirlik düzeyleri hakkında daha fazla bilgi için bkz. erişim değiştiricileri.For more information about accessibility levels, see Access Modifiers.

Arabirim ile Dizin oluşturucular kullanma hakkında daha fazla bilgi için bkz. arabirim dizin oluşturucular.For more information about how to use indexers with an interface, see Interface Indexers.

Bir dizin oluşturucunun imzası, biçimsel parametrelerinin sayısı ve türlerinden oluşur.The signature of an indexer consists of the number and types of its formal parameters. Dizin Oluşturucu türü veya biçimsel parametrelerin adlarını içermez.It doesn't include the indexer type or the names of the formal parameters. Aynı sınıfta birden fazla Dizin Oluşturucu bildirirseniz, bunların farklı imzaları olmalıdır.If you declare more than one indexer in the same class, they must have different signatures.

Dizin Oluşturucu değeri bir değişken olarak sınıflandırılmıyor; Bu nedenle, Dizin Oluşturucu değeri bir ref veya Out parametresi olarak geçirilemez.An indexer value is not classified as a variable; therefore, you cannot pass an indexer value as a ref or out parameter.

Dizin oluşturucuyu diğer dillerin kullanabileceği bir adla sağlamak için, aşağıdaki örnekte gösterildiği gibi System.Runtime.CompilerServices.IndexerNameAttributekullanın:To provide the indexer with a name that other languages can use, use System.Runtime.CompilerServices.IndexerNameAttribute, as the following example shows:

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

Bu dizin oluşturucunun adı TheItemolacaktır.This indexer will have the name TheItem. Ad özniteliği sağlanmaması varsayılan adı yapar Item .Not providing the name attribute would make Item the default name.

Örnek 1Example 1

Aşağıdaki örnek, bir özel dizi alanının, tempsve bir dizin oluşturucunun nasıl bildirilemeyeceğini gösterir.The following example shows how to declare a private array field, temps, and an indexer. Dizin Oluşturucu örneğe tempRecord[i]doğrudan erişim sağlar.The indexer enables direct access to the instance tempRecord[i]. Dizin oluşturucuyu kullanmanın alternatifi, diziyi ortak bir üye olarak bildirmeli ve üyelerine tempRecord.temps[i]doğrudan erişim sağlar.The alternative to using the indexer is to declare the array as a public member and access its members, tempRecord.temps[i], directly.

Bir dizin oluşturucunun erişim değerlendirildiği zaman, örneğin bir Console.Write ifadede, Get erişimcisinin çağrıldığına dikkat edin.Notice that when an indexer's access is evaluated, for example, in a Console.Write statement, the get accessor is invoked. Bu nedenle, get bir erişimci yoksa, bir derleme zamanı hatası oluşur.Therefore, if no get accessor exists, a compile-time error occurs.

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
    */

Diğer değerleri kullanarak dizin oluşturmaIndexing using other values

C#Dizin Oluşturucu parametre türü tamsayı olarak sınırlandırmaz.C# doesn't limit the indexer parameter type to integer. Örneğin, bir Dizin Oluşturucu ile dize kullanmak yararlı olabilir.For example, it may be useful to use a string with an indexer. Bu tür bir Dizin Oluşturucu koleksiyondaki dizeyi arayarak ve uygun değeri döndürerek uygulanabilir.Such an indexer might be implemented by searching for the string in the collection, and returning the appropriate value. Erişimciler aşırı yüklenmiş olabilir, dize ve tamsayı sürümleri birlikte bulunabilir.As accessors can be overloaded, the string and integer versions can co-exist.

Örnek 2Example 2

Aşağıdaki örnek, haftanın günlerini depolayan bir sınıf bildirir.The following example declares a class that stores the days of the week. get Erişimci bir dize, bir günün adı alır ve karşılık gelen tamsayıyı döndürür.A get accessor takes a string, the name of a day, and returns the corresponding integer. Örneğin, "Pazar" 0, "Pazartesi" 1 döndürür ve bu şekilde devam eder.For example, "Sunday" returns 0, "Monday" returns 1, and so on.

// 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 an Exception if the day is not found
    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

Güçlü programlamaRobust programming

Dizin oluşturucularının güvenliğinin ve güvenilirliğinin iyileşmesi için kullanabileceğiniz iki ana yol vardır:There are two main ways in which the security and reliability of indexers can be improved:

  • İstemci kodunun geçersiz bir dizin değeri geçirme olasılığını işlemek için bir tür hata işleme stratejisi eklediğinizden emin olun.Be sure to incorporate some type of error-handling strategy to handle the chance of client code passing in an invalid index value. Bu konunun önceki kısımlarında yer alan ilk örnekte, TempRecord sınıfı, istemci kodun dizin oluşturucuya geçirmeden önce girişi doğrulamasını sağlayan bir length özelliği sağlar.In the first example earlier in this topic, the TempRecord class provides a Length property that enables the client code to verify the input before passing it to the indexer. Hata işleme kodunu dizin oluşturucunun içine de yerleştirebilirsiniz.You can also put the error handling code inside the indexer itself. Bir Dizin Oluşturucu erişimcisinde oluşturduğunuz tüm özel durumları kullanıcılara belgelediğinizden emin olun.Be sure to document for users any exceptions that you throw inside an indexer accessor.

  • Get ve set erişimcilerinin erişilebilirliğini makul olacak şekilde kısıtlayıcı olarak belirleyin.Set the accessibility of the get and set accessors to be as restrictive as is reasonable. Bu, set özellikle erişimcinin açısından önemlidir.This is important for the set accessor in particular. Daha fazla bilgi için bkz. erişimci erişilebilirliğini kısıtlama.For more information, see Restricting Accessor Accessibility.

Ayrıca bkz.See also