我知道我不应该暴露一个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");
}
}
Run Code Online (Sandbox Code Playgroud)
允许我的来电者简单地回到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™
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我想要一个真正不可变的List<T>,我总是要创建一个新的列表?例如,这似乎有效(测试在转换后为null):
public static IEnumerable<string> List
{
get
{
return new ReadOnlyCollection<string>(_list); …Run Code Online (Sandbox Code Playgroud) 当我想在我的课外制作一个只读的值类型时,我这样做:
public class myClassInt
{
private int m_i;
public int i {
get { return m_i; }
}
public myClassInt(int i)
{
m_i = i;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以做些什么来List<T>在我的课堂之外创建一个readonly类型(所以他们不能在其中添加/删除元素)?现在我只是宣布公开:
public class myClassList
{
public List<int> li;
public myClassList()
{
li = new List<int>();
li.Add(1);
li.Add(2);
li.Add(3);
}
}
Run Code Online (Sandbox Code Playgroud)