返回 List,以便调用方无法修改它

本文关键字:调用 方无法 修改 List String 返回 | 更新日期: 2023-09-27 18:32:55

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

返回 List<String>,以便调用方无法修改它

这在

List<T>类型中是不可能的。最好的方法是公开ReadOnlyCollection<T>类型的操作 (MSDN)。

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

添加

将项目添加到 ICollection。此实现始终引发 NotSupportedException。

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

AsReadOnly()添加到列表末尾

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

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

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

尝试:

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(); }
    }        
}