【发布时间】:2009-08-25 07:28:17
【问题描述】:
我知道我不应该在属性中公开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>,我是否总是需要创建一个新列表?例如,这似乎有效(转换后测试为空):
public static IEnumerable<string> List
{
get
{
return new ReadOnlyCollection<string>(_list);
}
}
但我担心每次有人尝试访问我的列表时都会克隆我的列表是否会产生性能开销?
【问题讨论】:
-
将 List(of T) 公开为属性有什么问题?
-
我不明白这是什么意思?我的意思是,我只是将属性公开为 List
... ???这是线程安全的问题吗? -
你需要扩展什么?
-
这篇文章举了一个例子:如果你想在添加/删除项目时得到通知,你就输了,因为你不能用 List 做到这一点,所以你必须对您的公共界面。同样在我的情况下,它更多的是关于获得一个只读列表而没有太多开销。