Эквивалент C # анонимных внутренних классов Java с блоками инициализации
-
22-08-2019 - |
Вопрос
В Java мне нравится использовать такие конструкции, как
List<String> list = new ArrayList<String>() {{add("foo");}};
Есть ли способ сделать это в 1 строке и в C # тоже?
Решение
Я думаю, что вам нужен инициализатор массива
List<string> list = new List<string>() { "foo" };
Несколько элементов должны быть разделены запятыми
List<string> list = new List<string>() { "foo","bar","bas"};
Другие советы
Это называется инициализатор коллекции и это часть C # 3.0.
Помимо списков, вы можете инициализировать коллекции более сложных типов, при условии, что они реализуют IEnumerable и имеют соответствующие методы добавления для каждого элемента в инициализаторе коллекции.Например, вы можете использовать Add(key, value)
способ Dictionary<TKey, TValue>
вот так:
var dict = new Dictionary<string, int>
{
{"first", 10 },
{"second", 20 }
};
Более подробную информацию можно найти в главе 8 C # in Detail, которую можно бесплатно загрузить с Веб-сайт Мэннинга.
Вы можете сделать это в .NET 3.5, чтобы задать значения свойств:
List<string> list = new List<string> () { Property = Value, Property2 = Value2 };
Или для инициализации массива:
List<string> list = new List<string> () { "value1", "value2" };
Однако вы не можете вызывать методы таким образом.
Если вам просто нужно разобраться с добавлением объектов в коллекцию, то инициализаторы коллекции отлично работают, но если вам нужно выполнить дополнительную статическую инициализацию, вы можете использовать нечто, называемое статическим конструктором, который работает так же, как статический инициализатор в java
Это имеет плохое форматирование, но, кажется, покрывает его