*解决了。感谢各位的解释,我没有完全理解在这种情况下使用值类型的含义。
我有一个从静态类中使用的结构。但是,当我在运行时打印其内部状态时,该行为显示出意外行为。这是我的结构:
public struct VersionedObject
{
public VersionedObject(object o)
{
m_SelectedVer = 0;
ObjectVersions = new List<object>();
ObjectVersions.Add(o);
}
private int m_SelectedVer;
public int SelectedVersion
{
get
{
return m_SelectedVer;
}
}
public List<object> ObjectVersions;//Clarifying: This is only used to retrieve values, nothing is .Added from outside this struct in my code.
public void AddObject(object m)
{
ObjectVersions.Add(m);
m_SelectedVer = ObjectVersions.Count - 1;
}
}
测试代码
VersionedObject vo = new VersionedObject(1);
vo.AddObject(2);//This is the second call to AddObject()
//Expected value of vo.SelectedVerion: 1
//Actual value of vo.SelectedVersion: 1
现在,如果您单独测试此代码,即,将其复制到您的项目中试一试,它将返回预期的结果。
问题; 我在生产代码中观察到的是这个调试输出:
objectName, ObjectVersions.Count:2, SelectedVer:0,
为什么?根据我的理解和测试,这在任何情况下都应该是完全不可能的。
我的随机猜测是存在某种不变性,由于某种原因,正在通过默认构造函数实例化一个新结构,并且正在复制 ObjectVersions 数据,但是 m_SelectedVersion 是私有的,不能复制到新结构中?
我使用静态类和方法来操作结构与它有什么关系吗?
我很困惑,我现在只是在胡乱猜测。