2012-03-15 45 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

相关问题