Arabirimlerdeki Dizin Oluşturucular (C# Programlama Kılavuzu)Indexers in Interfaces (C# Programming Guide)

Dizin oluşturucular bir arabirimdebildirilemez.Indexers can be declared on an interface. Arabirim dizin oluşturucularının erişimcileri, sınıf dizin oluşturucularının erişimcilerine aşağıdaki yollarla göre farklılık gösterir:Accessors of interface indexers differ from the accessors of class indexers in the following ways:

  • Arabirim erişimcileri değiştiriciler kullanmaz.Interface accessors do not use modifiers.
  • Arabirim erişimcisinin genellikle gövdesi yoktur.An interface accessor typically does not have a body.

Erişimcinin amacı, dizin oluşturucunun okuma-yazma, salt okunurdur veya salt yazılır olduğunu belirtsağlamaktır.The purpose of the accessor is to indicate whether the indexer is read-write, read-only, or write-only. Bir arabirimde tanımlanmış bir Dizin Oluşturucu için uygulama sağlayabilirsiniz, ancak bu nadir bir durumdur.You may provide an implementation for an indexer defined in an interface, but this is rare. Dizin oluşturucular genellikle veri alanlarına erişmek için bir API tanımlar ve veri alanları bir arabirimde tanımlanamaz.Indexers typically define an API to access data fields, and data fields cannot be defined in an interface.

Arabirim dizin oluşturucu erişimcisine bir örnek aşağıda verilmiştir:The following is an example of an interface indexer accessor:

public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}

Bir dizin oluşturucunun imzası aynı arabirimde belirtilen diğer tüm dizin oluşturucularının imzalarından farklı olmalıdır.The signature of an indexer must differ from the signatures of all other indexers declared in the same interface.

ÖrnekExample

Aşağıdaki örnek, arabirim dizin oluşturucularının nasıl uygulanacağını gösterir.The following example shows how to implement interface indexers.

// Indexer on an interface:
public interface IIndexInterface
{
    // Indexer declaration:
    int this[int index]
    {
        get;
        set;
    }
}

// Implementing the interface.
class IndexerClass : IIndexInterface
{
    private int[] arr = new int[100];
    public int this[int index]   // indexer declaration
    {
        // The arr object will throw IndexOutOfRange exception.
        get => arr[index];
        set => arr[index] = value;
    }
}
IndexerClass test = new IndexerClass();
System.Random rand = new System.Random();
// Call the indexer to initialize its elements.
for (int i = 0; i < 10; i++)
{
    test[i] = rand.Next();
}
for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine($"Element #{i} = {test[i]}");
}

/* Sample output:
    Element #0 = 360877544
    Element #1 = 327058047
    Element #2 = 1913480832
    Element #3 = 1519039937
    Element #4 = 601472233
    Element #5 = 323352310
    Element #6 = 1422639981
    Element #7 = 1797892494
    Element #8 = 875761049
    Element #9 = 393083859
*/

Yukarıdaki örnekte, arabirim üyesinin tam adını kullanarak açık arabirim üye uygulamasını kullanabilirsiniz.In the preceding example, you could use the explicit interface member implementation by using the fully qualified name of the interface member. Örneğin:For example

string IIndexInterface.this[int index]
{
}

Ancak, tam adı yalnızca, sınıf aynı Dizin Oluşturucu imzasına sahip birden fazla arabirim uygularken karışıklığı önlemek için gereklidir.However, the fully qualified name is only needed to avoid ambiguity when the class is implementing more than one interface with the same indexer signature. Örneğin, bir Employee Sınıf iki arabirim uygusa ve ICitizen IEmployee her iki arabirimde de aynı Dizin Oluşturucu imzası varsa, açık arabirim üye uygulaması gereklidir.For example, if an Employee class is implementing two interfaces, ICitizen and IEmployee, and both interfaces have the same indexer signature, the explicit interface member implementation is necessary. Diğer bir deyişle, aşağıdaki Dizin Oluşturucu bildirimi:That is, the following indexer declaration:

string IEmployee.this[int index]
{
}

arabirim üzerinde dizin oluşturucuyu uygular IEmployee , aşağıdaki bildirim:implements the indexer on the IEmployee interface, while the following declaration:

string ICitizen.this[int index]
{
}

arabirimindeki Dizin oluşturucuyu uygular ICitizen .implements the indexer on the ICitizen interface.

Ayrıca bkz.See also