我的传递参考并没有做它应该做的事情

时间:2012-02-29 05:58:26

标签: c# pointers pass-by-reference

我在这里摸不着头脑......我有一个大型的程序,我用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中的compoundSetDataSet中的dw应该是相同的,但不是。

如果我在关闭事件中的DataWindow课程中设置了断点,我可以看到本地dw.dataSetWorkFlow.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

2 个答案:

答案 0 :(得分:3)

您的标签有点偏离(因为您的术语有点偏离)但您对这些概念的理解是正确的。您发布的代码不是问题的根源。

具体来说:您没有通过引用传递,您正在传递引用类型。因为它是一个引用类型,你不是传递对象本身,而是传递对象(不是“指针” - 是的,引用是作为指针实现的,但这是一个实现细节,而单词“指针” “在c#中有一个特定的,不同的含义。因为您没有使用“ref”关键字,所以您按值传递该引用(但这可能与您的问题无关)。

我猜想有一些绑定问题导致ui中的更改不会传输到dataSet对象。但是根据您发布的代码,DataWindow和CompoundSet确实应该使用相同的对象。

您也可能在重定义代码中重新分配dataSet变量,并期望将重新分配应用于compoundSet.DataSet属性,但您的问题暗示情况并非如此。

答案 1 :(得分:0)

确保您使用的是ref关键字。根据具体情况,您最终可能会得到重复的对象,而不是对该对象的引用(这就是您所看到的)。为避免这种情况,ref强制对象通过引用传递,确保您正在查看(并修改)同一对象。