我在这里摸不着头脑......我有一个大型的程序,我用C#写的,里面有一个小错误,这对我来说完全没有意义。
非常快的背景:
我有一个名为CompoundSet
的类,其中包含DataSet
(不是System.Data.DataSet
,它是我自己定义的类),其定义如下:
public class CompoundSet
{
private DataSet dataSet;
public DataSet { get { return dataSet; } }
//...
}
compountSet
是我主要工作流类中的本地成员,我启动了一个这样的数据编辑器窗口:
DataWindow dw = new DataWindow(compoundSet.DataSet);
DataWindow
的构造函数是这样的:
public DataWindow(DataSet dataSet)
{
// ...
this.dataSet = dataSet;
}
并且DataWindow在各种GUI控件中列出DataSet
的内容。
该窗口显示DataSet中当前的内容。用户可以根据需要修改数据。当它们关闭dw
时,对数据的更改应该在CompoundSet
中,因为我们只传递指针。 DataSet
中的compoundSet
和DataSet
中的dw
应该是相同的,但不是。
如果我在关闭事件中的DataWindow
课程中设置了断点,我可以看到本地dw.dataSet
和WorkFlow.compoundSet.DataSet
没有相同的信息。
鉴于我已将指针compoundSet.DataSet
传递给构造函数中的DataWindow
类,我在new
中没有使用DataWindow
关键字,这不会对我有意义吗?
为什么我的compoundSet.DataSet
与我的dw.dataSet
不同?
编辑:我尝试过像这样创建DataWindow
:
DataSet ds = compoundSet.DataSet;
DataWindow dw = new DataWindow(ds);
dw.ShowDialog(this); // breakpoint on dw.FormClosing shows the dataset has new data
return; // breakpoint here shows ds is different from dw.dataSet
答案 0 :(得分:3)
您的标签有点偏离(因为您的术语有点偏离)但您对这些概念的理解是正确的。您发布的代码不是问题的根源。
具体来说:您没有通过引用传递,您正在传递引用类型。因为它是一个引用类型,你不是传递对象本身,而是传递对象(不是“指针” - 是的,引用是作为指针实现的,但这是一个实现细节,而单词“指针” “在c#中有一个特定的,不同的含义。因为您没有使用“ref”关键字,所以您按值传递该引用(但这可能与您的问题无关)。
我猜想有一些绑定问题导致ui中的更改不会传输到dataSet对象。但是根据您发布的代码,DataWindow和CompoundSet确实应该使用相同的对象。
您也可能在重定义代码中重新分配dataSet变量,并期望将重新分配应用于compoundSet.DataSet属性,但您的问题暗示情况并非如此。
答案 1 :(得分:0)
确保您使用的是ref关键字。根据具体情况,您最终可能会得到重复的对象,而不是对该对象的引用(这就是您所看到的)。为避免这种情况,ref
强制对象通过引用传递,确保您正在查看(并修改)同一对象。