1

我将List<string>其作为属性公开,但希望避免在对象之外对其进行修改。在 C# 中最好的方法是什么,我是创建一个新副本List<string>还是做其他事情..

4

4 回答 4

6

这对于类型是不可能的List<T>。最好的方法是公开ReadOnlyCollection<T>类型的属性(MSDN)。

您可能会认为它显式实现ICollection了公开Add()方法的接口,但不要担心并记住:

ICollection.Add

将项目添加到 ICollection。此实现总是抛出 NotSupportedException。

顺便说一句,为什么你需要List<T>类型?也许暴露类型的属性IEnumerable<T>就足够了?您正在使用哪个特定功能List<T>,可能是内置的排序/搜索方法?无论如何,如果你真的需要List<T>- 你可以将它用作属性支持字段的类型,并通过ReadonlyCollection<T>(IList<T> list)构造函数或使用List<T>.AsReadonly()方法调用对其进行转换,实际上没有区别,因为AsReadonly()它是单行方法return new ReadOnlyCollection<T>(this);

于 2012-04-30T20:19:18.940 回答
2

添加AsReadOnly()到列表的末尾

ReadOnlyCollection<string> test = new List<string> {"test"}.AsReadOnly();
于 2012-04-30T20:20:02.913 回答
1

返回IEnumberable<String>。这样,即使您更改了实现(您可能会觉得使用数据XYZ结构使程序更高效),调用者也不必更改代码。

我只是想知道你为什么要强制执行这样的约束。如果可能,请向社区提供更多详细信息,他们可能会更好地帮助您。

于 2012-04-30T20:20:26.057 回答
0

尝试:

MyClass myClass = new MyClass();

class MyClass
{
    public MyClass()
    {
        _MyProperty = new List<string>();
        _MyProperty.Add("Test 1");
        _MyProperty.Add("Test 2");
    }
    private List<string> _MyProperty;
    public System.Collections.ObjectModel.ReadOnlyCollection<string> MyProperty 
    {
        get { return _MyProperty.AsReadOnly(); }
    }        
}
于 2012-04-30T20:27:14.640 回答