Как квадратные скобки в объявлении метода вписываются в C #? - PullRequest
1 голос
/ 10 сентября 2010

Как квадратные скобки в объявлении метода вписываются в c #? То есть я вижу, что при чтении проверки WPF можно использовать IDataErrorInfo с примером следующего.

публичная строка this [string propertyName]

// Error handling takes place here.
public string this[string propertyName]  // <== IE HERE
{
  get
  // etc 
  }
}

Я отмечаю, что MSDN говорит: «Квадратные скобки ([]) используются для массивов, индексаторов и атрибутов. Они также могут использоваться с указателями». Так является ли приведенное выше использование указателем?

Ответы [ 3 ]

9 голосов
/ 10 сентября 2010

Это стандартная функция языка C #, называемая Indexer . Как правило, вы будете использовать их при написании собственных коллекций или аналогичных типов. Вот краткий (не реальный мир) пример.

public class Foo {
    private List<int> m_Numbers = new List<int>();

    public int this[int index] {
        get {
            return m_Numbers[index];
        }
        set {
            m_Numbers[index] = value;
        }
    }
}

class Program {
    static void Main() {
        Foo foo = new Foo();
        foo[0] = 1;
    }
}

Есть много классных вещей, для которых вы можете использовать индексаторы, если вы креативны, это действительно интересная особенность языка.

4 голосов
/ 10 сентября 2010

Это объявление индексатора. Это аналогично индексации массивов. propertyName - это строка, которую метод использует для индексации в какую-то коллекцию. Метод возвращает соответствующую строку из коллекции.

Конечно, метод может делать что-то еще, но это означает семантику.

2 голосов
/ 10 сентября 2010

Это было бы свойство индексатора.Они полезны для пользовательских коллекций:

public class MyCustomCollection
{
    List<MyObject> _list = new List<MyObject>();

    public string this[string name]
    {
        get { return _list.Single(o => o.Name == name)
                          .Select(o => o.Description);
    }

    public string this[int id]
    {
        get { return _list.Single(o => o.Id == id).Select(o => o.Description);
    }
}

И тогда вы можете использовать коллекцию как:

MyCollection col = new MyCollection();

// Fill the collection

string description = col["Name"];
string description2 = col[2];
...