2012-03-15 80 views
0

所以我有這個;爲什麼我的一個價值觀改變了?

var emailA = ConstructEmailA(); 
SnedEmailA(emailA.Append("</body>").ToString()); 

var emailB = ConstructEmailB(emailA); 
SendEmailB(emailB.ToString()); 

這工作正常。本質上,ConstructEmailB需要emailA並添加到它。然而,我原來是這樣的:

var emailA = ConstructEmailA(); 
var emailB = ConstructEmailB(emailA); 
SnedEmailA(emailA.Append("</body>").ToString());     
SendEmailB(emailB.ToString()); 

哪一個沒有按預期工作。而不是emailA和emailB不同,emailA包含與emailB相同的信息。怎麼來的?

這裏是我的ConstructEmailB方法:

private StringBuilder ConstructEmailB(StringBuilder email) 
{ 
    email.Append("Append stuff"); 

    return email; 
} 

回答

4

哪一個沒有按預期工作。而不是emailA和emailB不同,emailA包含與emailB相同的信息。怎麼來的?

因爲emailAemailB。它們都是對同一個StringBuilder對象的引用,唯一的區別是,當您撥打時,您會撥打SendEmail。在第一種情況下,您

  1. 構造emailA
  2. 追加到emailA
  3. 在該時間點捕獲值並將其發送到SendEmailA
  4. 「構建emailB,這實際上只是追加到emailA然後發送。

在第二種情況下,你必須:

  1. 構建emailAemailB。它們是相同的,因爲它們都是同一個StringBuilder的引用。
  2. '附加到emailA(並且因此還對emailB)併發送它。
  3. 發送emailB
2

(通過第二個場景,一個你不理解去。)

你只是建立一個單一的StringBuilder對象。您正在將對該對象的引用傳遞到ConstructEmailB,該對象正在修改該對象的內容,並再次返回相同的引用。

所以你最終調用ConstructEmailB一個StringBuilder,與「附加的東西」結尾。然後,您將追加到StringBuilder,並在其上調用ToString()兩次。這將給出相同的結果兩次。

我懷疑這兩篇文章中,我寫了,而以前可以幫助你理解:

我想強調的是,這是絕對關鍵你瞭解這裏發生了什麼。雖然有很多種方法可以解決這個問題,但是根本不要改變你的代碼(除了實驗之外),直到你確信你明白髮生了什麼。

+1

-1,純粹出於惡意和小氣:D – 2012-03-15 19:32:28

相關問題