2012-02-29 46 views
4

以下是示例代碼: 只讀擴展不適用於引用類型集合。如果我將員工更改爲字符串,那麼它將起作用。 有人可以解釋爲什麼我得到這種行爲。IList <T> .AsReadOnly擴展方法不適用於引用類型集合

 List<Employee> Emps = new List<Employee>(2) 
     { 
      new Employee(){EmpName="E1",Year=2012,EmpID=1}, 
      new Employee(){EmpName="E2",Year=2012,EmpID=2} 
     }; 
     Emps.ForEach(emp => Debug.WriteLine(emp.EmpName)); 
     **IList<Employee> readonlyEmp = Emps.AsReadOnly(); 
     readonlyEmp[0].EmpName = "EMPUpdated";** 
     foreach (var emp in readonlyEmp) 
     { 
      Debug.WriteLine(emp.EmpName); 
     } 

回答

9

A ReadOnlyCollection防止修改集合中的引用。它不會阻止對引用對象的修改。如果你有一個ReadOnlyCollection<string>,你不能改變任何東西,因爲string是不可變的。你的Employee類是可變的,可以改變。

所以明顯的解決辦法是使Employee不可變。使屬性只讀並在構造函數中初始化它們。

+0

Thanks.Got it.so asreadonly()擴展方法只防止COUNT如果對象是可變的。 – mahalingam 2012-02-29 10:05:31

+1

@mahalingam只讀集合不能添加,刪除或**交換**;例如,你可以做一個可變集合'list [24] = anotherValue;' - 你不能用只讀集合來做到這一點。所以它不只是數量。 – 2012-02-29 10:21:05

+1

不僅是元素的數量,還有對單個元素的引用:即使不會更改Count,您也不能執行readonlyEmp [0] = new Employee();'。 – 2012-02-29 10:22:04

相關問題