2010-10-16 56 views
1

這段時間我一直在學習Java,而我剛纔讀到的是"Be careful not to write accessor methods that return references to mutable objects"這真的很有趣。現在我想知道在C#中的Properties和Accessor方法是否相同?或者C#已經自動返回克隆副本?返回引用類型的方法返回引用還是克隆副本?

謝謝。

回答

8

引用就是......引用存儲在內存中的某個對象。除非您明確編寫代碼以創建一個克隆並將參考返回給該對象,否則您將始終傳遞對同一實例的引用。

它試圖讓您避免的情況是將對象引用移交給您所依賴的調用方。您無法控制哪些人或哪些人可能會改變該對象的狀態,因此您的課程可能會以不可預知的結果結束。

是一個愚蠢的例子:

public class Employee 
{ 
    public Salary Salary {get; set;} 

    public void GiveRaise() 
    { 
     Salary.Total *= .25; 

     if(Salary.Total > 100000) 
     { 
      Promote(); 
      GiveBiggerOffice(); 
     } 
     else 
     { 
      GiveWatch(); 
     } 
    } 
} 

因此,可以說這傢伙的$ 50,000的工資,只是得到了加薪。現在他的薪水是62,500美元,他應該得到一個不錯的新手錶。但是,另一個線程很可能會引用此對象。這意味着他們也可以訪問Salary屬性,並且可以在if塊運行之前將薪水總額改變爲100,000美元以上。

在這種尷尬的情況下,即使Raise()方法只被調用一次,該員工也會得到促銷和新辦公室。

愚蠢的我知道,但證明了這一點。

+3

更正(因爲在我可以編輯您的文章之前,我需要2個更多的代表):「...您將始終傳遞對同一個實例的引用」。 – dty 2010-10-16 21:38:28

+0

您所說的是當您返回例如'Date'類型時,C#不會自動創建克隆副本。 – Tarik 2010-10-16 21:41:20

+0

@Braveyard:'DateTime'(我假設你指的是)值類型,而不是引用類型。 – 2010-10-16 21:52:24

相關問題