#c# #collections #initialization
#c# #Коллекции #инициализация
Вопрос:
При инициализации действий WF4 мы можем сделать что-то вроде этого:
Sequence s = new Sequence()
{
Activities = {
new If() ...,
new WriteLine() ...,
}
}
Обратите внимание, что Sequence.Activities
это Collection<Activity>
, но его можно инициализировать без новой коллекции().
Как я могу эмулировать это поведение в своих Collection<T>
свойствах?
Ответ №1:
Любая коллекция, которая имеет Add()
метод и реализует IEnumerable
, может быть инициализирована таким образом. Для получения подробной информации обратитесь к инициализаторам объектов и коллекций для C #. (Отсутствие вызова new Collection<T>
связано с инициализатором объекта, а возможность добавлять элементы в строку — с инициализатором коллекции.)
Компилятор автоматически вызовет Add()
метод вашего класса с элементами в блоке инициализации коллекции.
В качестве примера, вот очень простой фрагмент кода для демонстрации:
using System;
using System.Collections.ObjectModel;
class Test
{
public Test()
{
this.Collection = new Collection<int>();
}
public Collection<int> Collection { get; private set; }
public static void Main()
{
// Note the use of collection intializers here...
Test test = new Test
{
Collection = { 3, 4, 5 }
};
foreach (var i in test.Collection)
{
Console.WriteLine(i);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
Комментарии:
1. … и который реализует IEnumerable 🙂
2. @Jon: Совершенно верно — я отредактировал, чтобы быть более явным. (Я склонен всегда реализовывать IEnumerable в «коллекции», но на самом деле это не является обязательным требованием ;))
3. Да, но моя коллекция использует
System.Collections.ObjectModel.Collection<T>
, которая уже реализует IEnumerable и имеет метод Add(). Правда в том, что он не выдает никакой ошибки компиляции, но при повторении он кажется пустым.4. Более того, ссылка, которую вы дали, не иллюстрирует этот тип инициализации.
5. @Jota: На самом деле это ссылка, которая показывает, как это работает. Я просто разместил несколько рабочих примеров кода для демонстрации. Попробуйте программу выше — она использует инициализаторы коллекции с
Collection<T>
, чтобы точно обработать этот сценарий.