C # Эквивалент внутренних анонимных классов Java с блоками инициализации - PullRequest
2 голосов
/ 11 февраля 2009

В Java я люблю использовать такие конструкции, как

List<String> list = new ArrayList<String>() {{add("foo");}};

Есть ли способ сделать это в 1 строке в C #?

Ответы [ 4 ]

8 голосов
/ 11 февраля 2009

Это называется инициализатором коллекции , и это часть C # 3.0.

Как и списки, вы можете инициализировать коллекции более сложных типов, если они реализуют IEnumerable и имеют подходящие методы Add для каждого элемента в инициализаторе коллекции. Например, вы можете использовать Add(key, value) метод Dictionary<TKey, TValue>, например:

var dict = new Dictionary<string, int> 
{ 
    {"first", 10 }, 
    {"second", 20 }
};

Более подробную информацию можно найти в главе 8 C # в Depth, которую можно бесплатно загрузить с веб-сайта Мэннинга .

6 голосов
/ 11 февраля 2009

Я думаю, что вы хотите, это инициализатор массива

List<string> list = new List<string>() { "foo" };

Несколько элементов должны быть разделены запятыми

List<string> list = new List<string>() { "foo","bar","bas"};
2 голосов
/ 11 февраля 2009

Вы можете сделать это в .NET 3.5, чтобы установить значения свойств:

List<string> list = new List<string> () { Property = Value, Property2 = Value2 };

Или для инициализации массива:

List<string> list = new List<string> () { "value1", "value2" };

Однако, вы не можете вызывать методы таким образом.

0 голосов
/ 11 февраля 2009

Если вам просто нужно иметь дело с добавлением объектов в коллекцию, то инициализаторы коллекции работают отлично, но если вам нужно выполнить больше статической инициализации, вы можете использовать нечто, называемое статическим конструктором, который работает так же, как статический инициализатор в Java

Этот имеет плохое форматирование, но, кажется, покрывает его

...