返回List <string>以便调用者无法修改它</string>

时间:2012-04-30 20:17:38

标签: c#

我将List<string>作为属性公开,但希望避免在对象之外进行修改。在C#中执行此操作的最佳方法是,我是否创建了List<string>的新副本或执行其他操作..

4 个答案:

答案 0 :(得分: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()方法调用来转换它,真的没有区别,因为{{1是AsReadonly()的单行方法。

答案 1 :(得分:2)

AsReadOnly()添加到列表的末尾

ReadOnlyCollection<string> test = new List<string> {"test"}.AsReadOnly();

答案 2 :(得分:1)

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

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

答案 3 :(得分: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(); }
    }        
}