Ключевое слово this в качестве свойства - PullRequest
17 голосов
/ 25 марта 2010

Я хорошо знаю C #, но для меня это странно. В какой-то старой программе я видел этот код:

public MyType this[string name]
{
    ......some code that finally return instance of MyType
}

Как это называется? Какая польза от этого?

Ответы [ 4 ]

30 голосов
/ 25 марта 2010

Это индексатор . После того как вы объявили это, вы можете сделать так:

class MyClass
{
    Dictionary<string, MyType> collection;
    public MyType this[string name]
    {
        get { return collection[name]; }
        set { collection[name] = value; }
    }
}

// Getting data from indexer.
MyClass myClass = ...
MyType myType = myClass["myKey"];

// Setting data with indexer.
MyType anotherMyType = ...
myClass["myAnotherKey"] = anotherMyType;
7 голосов
/ 25 марта 2010

Это свойство индексатора . Он позволяет вам «обращаться» к вашему классу напрямую по индексу, так же, как и к массиву, списку или словарю.

В вашем случае вы можете получить что-то вроде:

public class MyTypes
{
    public MyType this[string name]
    {
        get {
            switch(name) {
                 case "Type1":
                      return new MyType("Type1");
                 case "Type2":
                      return new MySubType();
            // ...
            }
        }
    }
}

Тогда вы сможете использовать это как:

MyTypes myTypes = new MyTypes();
MyType type = myTypes["Type1"];
2 голосов
/ 25 марта 2010

Это специальное свойство, называемое Indexer . Это позволяет обращаться к вашему классу как к массиву.

myInstance[0] = val;

Такое поведение вы увидите чаще всего в пользовательских коллекциях, поскольку синтаксис массива - это хорошо известный интерфейс для доступа к элементам в коллекции, которые могут быть идентифицированы по значению ключа, обычно по их позиции (как в массивах и списках) или по логическому ключу (как в словарях и хеш-таблицах).

Вы можете узнать больше об индексаторах в статье MSDN Индексаторы (Руководство по программированию в C #) .

0 голосов
/ 25 марта 2010

Это индексатор, обычно используемый как класс типа коллекции.

Взгляните на Использование индексаторов (Руководство по программированию в C #) .

...