2010-04-21 19 views
0
public class Foo{ 
     public string Prop1 {get;set;} 
     public string Prop2 {get;set;} 

     public Foo(Foo source) { 
      this.Prop1 = source.Prop1; 
      this.Prop2 = source.Prop2; 
     } 
    } 

    public class Main 
    { 
     private List<Foo> items = new List<Foo>(); 

     public IEnumerable<Foo> GetItems() { 
      foreach (Foo foo in items) { 
       yield return new Foo(foo); 
      } 
     } 
    } 
+5

你的意思是安全嗎? – ChaosPandion 2010-04-21 14:25:37

回答

1

這取決於你所說的安全。如果調用對象正要從foo讀取信息。相反的:

public IEnumerable<Foo> GetItems() { 
      foreach (Foo foo in items) { 
       yield return new Foo(foo); 
      } 

爲什麼不只是做:

public IEnumerable<Foo> GetItems() { 
      foreach (Foo foo in items) { 
       yield return foo; 
      } 

如果你正試圖阻止調用對象從修改原始FOO,你做了什麼工作。

您也可以將foo設置爲不可變,並且您不必擔心確保您正確複製所有屬性等。這樣,每次返回時都不必創建新對象通過調查員。

發表埃裏克利珀的不變性:
http://blogs.msdn.com/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx

上不變性其他鏈接:
http://codebetter.com/blogs/patricksmacchia/archive/2008/01/13/immutable-types-understand-them-and-use-them.aspx

0

聲明:我知道Java的,但與C#

如果你是經驗非常少試圖創建一個副本列表,以便原始列表元素保持「不可變」,並且希望儘可能地將其作爲一般,也許您應該調查克隆,或者更確切地說, deep-copying

否則,只是創建Item foo的新實例並不一定會確保您有完美的初始化副本?

0

好吧,看起來很清楚你正在尋找一個不可變的迭代器。這有效,但並不完全有效。你可以嘗試讓你的類是這樣的:

public class Foo { 
    public string Prop1 { get; private set;} 
    public string Prop2 { get; private set;} 

    public Foo(string prop1, string prop2) { 
     this.Prop1 = prop1; 
     this.Prop2 = prop2; 
    } 
} 

這不完全是一成不變的,但對於大多數的意圖是。

+0

不能修改Prop1,現在調用者有一個修改的Prop1而不知道它? – Kenoyer130 2010-04-21 15:27:31

+0

@ user200295 - 字符串是不可變的。 – ChaosPandion 2010-04-21 15:55:29

+0

如果該屬性是一個類或其他可變對象會怎麼樣? – Kenoyer130 2010-04-21 17:14:45

相關問題