Я знаю, что я не должен раскрывать List<T>
в свойстве, но мне интересно, как правильно это сделать? Например, сделав это:
public static class Class1
{
private readonly static List<string> _list;
public static IEnumerable<string> List
{
get
{
return _list;
//return _list.AsEnumerable<string>(); behaves the same
}
}
static Class1()
{
_list = new List<string>();
_list.Add("One");
_list.Add("Two");
_list.Add("Three");
}
}
позволит моему абоненту просто вернуть обратно к List<T>
:
private void button1_Click(object sender, EventArgs e)
{
var test = Class1.List as List<string>;
test.Add("Four"); // This really modifies Class1._list, which is bad™
}
Итак, если мне нужен действительно неизменный List<T>
, мне всегда нужно будет создать новый список? Например, кажется, что это работает (тест имеет значение null после броска):
public static IEnumerable<string> List
{
get
{
return new ReadOnlyCollection<string>(_list);
}
}
Но я беспокоюсь, если есть накладные расходы на производительность, так как мой список клонируется каждый раз, когда кто-то пытается его получить?