2010-03-25 3 views
12

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

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

Как его зовут? Какая польза от этого?

ответ

25

Это indexer. После того, как вы его объявили, вы можете сделать следующее:

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; 
+0

Этот ответ был бы более полным, если вы указали свойство get (и/или set) в вашем блоке «.... некоторый код». Это говорит о том, что это больше похоже на метод. –

+0

Спасибо, я обновил ответ. –

+0

И сделал намного менее обычным, построив в общих коллекциях, которые покрывают потребности большинства людей. Не нужно писать свои собственные типизированные коллекции, чтобы получить стандартное поведение. –

6

Это Indexer Property. Он позволяет вам «получить доступ» к вашему классу напрямую по индексу, так же как вы получите доступ к массиву, списку или словарю.

В вашем случае, вы могли бы иметь что-то вроде:

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

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

myInstance[0] = val; 

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

Вы можете узнать больше об индексаторах в статье MSDN Indexers (C# Programming Guide).

Смежные вопросы