假设我有这个:

public class MyClass
{
    private readonly List<string> _strings = new List<string>();

    public IEnumerable<string> MyStrings
    {
        get
        {
            return _strings;
        }
    }
}


如何防止以下内容实际添加到字符串的成员变量列表中?

var theClass = new MyClass();
((List<string>)theClass.MyStrings).Add("I do not want to be able to add this!");

最佳答案

创建一个新类型,以“包装”序列。尽管有许多方法可以做到这一点,但一个相当简单的“ hack”是在身份转换中仅对它使用Select

return _strings.Select(x=>x);


这将创建一个具有自己的迭代器的新对象,该迭代器在内部具有对_strings列表的引用。由于存在额外的间接层(并且该类型的额外好处是该语言内部的一种类型,该类型在语言定义之外无法有效使用),因此调用者无法再将其转换为列表。

如果您希望阅读的内容更清晰一些,从而使意图更加清楚,则可以使用一个新方法:

public static IEnumerable<T> AsSequence<T>(this IEnumerable<T> sequence)
{
    return sequence.Select(x => x);
}


(随时为您命名最清晰的名称。)

关于c# - 如何保护仅访问器的IEnumerable <string>属性不受突变影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19800192/

10-10 15:57