为什么我的一个价值观改变了?
问题描述:
所以我有这个;为什么我的一个价值观改变了?
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;
}
答
哪一个没有按预期工作。而不是emailA和emailB不同,emailA包含与emailB相同的信息。怎么来的?
因为emailA
是emailB
。它们都是对同一个StringBuilder
对象的引用,唯一的区别是,当您拨打时,您会拨打SendEmail
。在第一种情况下,您
- 构造
emailA
。 - 追加到
emailA
。 - 在该时间点捕获值并将其发送到
SendEmailA
。 - “构建
emailB
,这实际上只是追加到emailA
然后发送。
在第二种情况下,你必须:
- 构建
emailA
和emailB
。它们是相同的,因为它们都是同一个StringBuilder
的引用。 - 将
'
附加到emailA(并且因此还对emailB
)并发送它。 - 发送
emailB
。
答
(通过第二个场景,一个你不理解去。)
你只是建立一个单一的StringBuilder
对象。您正在将对该对象的引用传递到ConstructEmailB
,该对象正在修改该对象的内容,并再次返回相同的引用。
所以你最终调用ConstructEmailB
后一个StringBuilder
,与“附加的东西”结尾。然后,您将追加到StringBuilder
,并在其上调用ToString()
两次。这将给出相同的结果两次。
我怀疑这两篇文章中,我写了,而以前可以帮助你理解:
我想强调的是,这是绝对关键你了解这里发生了什么。虽然有很多种方法可以解决这个问题,但是根本不要改变你的代码(除了实验之外),直到你确信你明白发生了什么。
-1,纯粹出于恶意和小气:D – 2012-03-15 19:32:28