我正试着go 理解我所看到的这种行为.我知道 struct 在移动时会被复制,因为它们是ValueType.但是我不明白为什么这个示例代码会失败.这里只有一个简单的C#代码来演示这个问题:
public class MyClass
{
private MyStruct ms;
public MyClass()
{
ms = new MyStruct("");
}
public void Add(dynamic d)
{
ms.Add(d);
}
public void Print()
{
Console.WriteLine("L: " + ms.GetLength());
}
}
public struct MyStruct
{
private dynamic[] items;
public MyStruct(string junk)
{
items = new dynamic[0];
}
public int GetLength()
{
return items.Length;
}
public void Add(dynamic d)
{
Array.Resize<dynamic>(ref items, items.Length + 1);
items[items.Length - 1] = d;
}
}
通过运行下面的代码,我得到了错误的结果.在调试器中,我可以看到项已添加,但并不持久,这意味着我看到了两次"L:0"(而不是"L:0"和"L:1"):
MyClass mc = new MyClass();
mc.Print();
mc.Add("Test");
mc.Print();
我注意到,如果在MyClass.Add中调用ms.Add时使用的类型不是"动态"(例如,"字符串"),则可以很好地工作.大概是这样的:
public void Add(string d)
{
ms.Add(d);
}
或者甚至是这样:
public void Add(dynamic d)
{
string s = d.ToString();
ms.Add(s);
}
这让我认为我可能正在制作一份副本,但如果是这样的话,我不明白为什么.我正在直接访问该字段,因此我预计这种情况不会发生.
非常提前感谢您.