假设我有这个:
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/