Я хорошо знаю С#, но для меня это что-то странное. В какой-то старой программе я видел этот код:
public MyType this[string name]
{
......some code that finally return instance of MyType
}
Как это называется? Какая польза от этого?
Я хорошо знаю С#, но для меня это что-то странное. В какой-то старой программе я видел этот код:
public MyType this[string name]
{
......some code that finally return instance of MyType
}
Как это называется? Какая польза от этого?
Это 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;
Это Свойство индексатора. Он позволяет вам "получить доступ" к вашему классу напрямую по индексу, так же, как вы получите доступ к массиву, списку или словарю.
В вашем случае у вас может быть что-то вроде:
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"];
Это специальное свойство, называемое Indexer. Это позволяет получить доступ к вашему классу, как массив.
myInstance[0] = val;
Такое поведение чаще всего вызывается в пользовательских коллекциях, так как синтаксис массива является хорошо известным интерфейсом для доступа к элементам в коллекции, которые могут быть идентифицированы с помощью значения ключа, обычно их положения (как в массивах и списках) или логическим ключом (как в словарях и хэш-таблицах).
Вы можете узнать гораздо больше об индексаторах в статье MSDN Indexers (Руководство по программированию на С#).
Это индекс, обычно используемый как класс типа коллекции.
Посмотрите Использование Indexers (Руководство по программированию на С#).