比较以下。首先使用 StringBuilder(引用类型):
public struct Tmd
{
public StringBuilder sb;
}
public void DoIt(Tmd a)
{
a.sb.Append(" World!");
}
public void Main()
{
Tmd a = new Tmd();
a.sb = new StringBuilder();
a.sb.Append("Hello");
DoIt(a);
Console.WriteLine(a.sb); // Hello World
}
这里复制了结构,以及对 StringBuilder 的引用以及它,但不复制 StringBuilder 本身。
现在有了一个可变结构(值类型):
public struct EvilMutable
{
public int i;
}
public struct Tmd
{
public EvilMutable em;
}
public void DoIt(Tmd a)
{
a.em.i += 1;
}
public void DoIt(EvilMutable em)
{
em.i += 1;
}
public void Main()
{
Tmd a = new Tmd();
a.em.i += 5;
Console.WriteLine(a.em.i); // 5
DoIt(a);
Console.WriteLine(a.em.i); // 5 (unchanged)
DoIt(a.em);
Console.WriteLine(a.em.i); // 5 (unchanged)
}
在这种情况下,一切都复制了。但是,如果我们将其更改为引用类型:
public class Tmd
{
public EvilMutable em;
}
然后,我们会得到这个:
Tmd a = new Tmd();
a.em.i += 5;
Console.WriteLine(a.em.i); // 5
DoIt(a);
Console.WriteLine(a.em.i); // 6
DoIt(a.em);
Console.WriteLine(a.em.i); // 6 (unchanged)