如果最终将其转换为IEnumerable,AsReadOnly是否有意义?

时间:2019-08-14 20:02:20

标签: c# ienumerable

我在this项目中看到了一些引起我注意的代码。

有一个简单的方法可以在List上调用AsReadOnly。该方法无需立即对ReadOnlyCollection进行处理,而是立即返回并将其隐式转换为IEnumerable。

如果只需要一个Enumerable,使用AsReadOnly有什么意义?

AsEnumerable会是更好的选择吗?

private List<PaymentMethod> _paymentMethods = new List<PaymentMethod>();

public IEnumerable<PaymentMethod> PaymentMethods => 
        _paymentMethods.AsReadOnly();

1 个答案:

答案 0 :(得分:9)

  

如果只需要可枚举的内容,使用AsReadOnly有什么意义?

关键是AsReadOnly确保了低信任度的敌对或越野车呼叫者无法将其抛回可变的集合。

  

AsEnumerable会是更好的选择吗?

不。试试这个:

List<int> list = new List<int>{ 10, 20, 30 };
...
IEnumerable<int> seq = list.AsEnumerable();
// Or (IEnumerable<int>)list, or whatever.
...
List<int> list2 = (List<int>)seq;
list2[0] = 40;

现在我们更改了list[0]

但是AsReadOnly可以防止这种情况,因为只读包装程序无法转换回List<int>

请记住,AsEnumerable只是写转换的一种视觉上更好的方式,而引用转换的转换是引用转换。引用未更改,可以将其更改回其实际类型!

当然,拥有完全信任的敌对或越野车呼叫者可以任意破坏安全系统,因为完全信任意味着完全信任。只读集合保留了对原始集合的引用,并且可以通过反射来检索该引用。

此外,请记住,只读表示只读,而不是不变。仍然可以观察来更改可变集合周围的只读包装;您只能通过只读包装程序更改它。