這段時間我一直在學習Java,而我剛纔讀到的是"Be careful not to write accessor methods that return references to mutable objects"
這真的很有趣。現在我想知道在C#中的Properties和Accessor方法是否相同?或者C#已經自動返回克隆副本?返回引用類型的方法返回引用還是克隆副本?
謝謝。
這段時間我一直在學習Java,而我剛纔讀到的是"Be careful not to write accessor methods that return references to mutable objects"
這真的很有趣。現在我想知道在C#中的Properties和Accessor方法是否相同?或者C#已經自動返回克隆副本?返回引用類型的方法返回引用還是克隆副本?
謝謝。
引用就是......引用存儲在內存中的某個對象。除非您明確編寫代碼以創建一個克隆並將參考返回給該對象,否則您將始終傳遞對同一實例的引用。
它試圖讓您避免的情況是將對象引用移交給您所依賴的調用方。您無法控制哪些人或哪些人可能會改變該對象的狀態,因此您的課程可能會以不可預知的結果結束。
是一個愚蠢的例子:
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()
方法只被調用一次,該員工也會得到促銷和新辦公室。
愚蠢的我知道,但證明了這一點。
更正(因爲在我可以編輯您的文章之前,我需要2個更多的代表):「...您將始終傳遞對同一個實例的引用」。 – dty 2010-10-16 21:38:28
您所說的是當您返回例如'Date'類型時,C#不會自動創建克隆副本。 – Tarik 2010-10-16 21:41:20
@Braveyard:'DateTime'(我假設你指的是)值類型,而不是引用類型。 – 2010-10-16 21:52:24