我试图理解这种行为。 我知道结构体是值类型,移动时会被复制。 但是我无法理解为什么此示例代码失败。这是一个简单的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 时使用的类型不是 "dynamic"(例如 "string"),它可以正常工作。类似于下面这样:
public void Add(string d)
{
ms.Add(d);
}
或者甚至是这样:
public void Add(dynamic d)
{
string s = d.ToString();
ms.Add(s);
}
这让我想到我可能正在处理一份副本,但如果是这种情况,我不明白为什么会这样。我直接访问该字段,因此不希望出现这种情况。
非常感谢您的提前帮助。
dynamic
==object
,只是所有成员访问的运行时绑定。因此,dynamic
也意味着您的结构值将被装箱。 - Jeremy Lakemanstring s = d.ToString();
。当d
是dynamic
类型时,这样做是不好的。 - Enigmativity