我在该项目中看到了一些引起我注意的代码。
有一个简单的方法可以在列表上调用AsReadOnly。该方法无需立即对ReadOnlyCollection进行处理,而是立即返回并将其隐式转换为IEnumerable。
如果只需要一个Enumerable,使用AsReadOnly有什么意义?
AsEnumerable会是更好的选择吗?
private List<PaymentMethod> _paymentMethods = new List<PaymentMethod>();
public IEnumerable<PaymentMethod> PaymentMethods => 
        _paymentMethods.AsReadOnly();
Run Code Online (Sandbox Code Playgroud)
    
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;
Run Code Online (Sandbox Code Playgroud)
现在我们已经改变了list[0]。
但是AsReadOnly可以避免这种情况,因为只读包装器无法转换回List<int>。
请记住,AsEnumerable这只是编写转换的一种视觉上更好的方式,并且作为参考转换的转换是参考转换。引用未更改,可以将其更改回其实际类型!
当然,拥有完全信任的敌对或越野车呼叫者可以任意破坏安全系统,因为完全信任意味着完全信任。只读集合维护对原始集合的引用,并且可以通过反射来检索该引用。
另外,请记住,只读表示只读,而不是不变。仍然可以观察到围绕可变集合的只读包装器发生了变化;您只是无法通过只读包装器对其进行更改。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           169 次  |  
        
|   最近记录:  |