2012-02-29 61 views
2

我在这里挠我的脑袋......我有一个我用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; 
} 

和数据窗口列出了各种GUI控制DataSet的内容。

该窗口显示DataSet中当前的内容。用户可以根据需要修改数据。当他们关闭dw时,数据的更改应该在CompoundSet之内,因为我们只传递指针。 DataSetcompoundSetDataSetdw应该是相同的,但事实并非如此。

如果我在关闭事件的DataWindow类中设置了一个断点,我可以看到本地dw.dataSetWorkFlow.compoundSet.DataSet没有相同的信息。

既然我已经通过了一个指向compoundSet.DataSet在构造函数中的DataWindow类,我在DataWindow无处使用new关键字,这没有任何意义,我?

为什么我的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

偶然,是'DataSet'结构? – 2012-02-29 06:08:52

+0

@ J.N。绝对不是:)我希望它是那么简单... – Ozzah 2012-02-29 06:09:28

+0

一些代码,您实际上将新项目设置到您的DataSet会很有趣。你只是修改DataSet的底层属性或DataSet对象本身? – Alex 2012-02-29 06:17:57

回答

3

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

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

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

也可能是您在重新分配的数据集变量中隐藏的代码,并期望重新分配适用于compoundSet.DataSet属性,但您的问题意味着情况并非如此。

+0

Re:你的第二个最后一段,没有约束力的问题。正如我所说的,DataWindow关闭事件中的一个断点表明本地的DataSet实例已经接受了这些改变。这些变化根本不会反映在主窗口中。 Re:你的最后一段,我不认为我已经重新分配了局部变量,但我正在检查我的代码。不幸的是,这是我最大的课程之一:\ – Ozzah 2012-02-29 06:23:49

+0

*叹* *我发现了这个问题。事实上,我确实在不知不觉中将其重新分配到代码中的某处。有一个按钮可以从Excel导入一些数据,并返回一个全新的DataSet。 – Ozzah 2012-02-29 06:30:11

+0

@Ozzah:看起来你发现了问题 - 重新宣布。 ;-) – 2012-02-29 06:52:51

0

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

+0

我从来没有观察到的行为,其中通过引用传递将传递重复的对象,而不是对我打算传递的对象的引用。无论如何,我已经添加了'ref',并且我的症状没有改变。但是,谢谢你的建议。 – Ozzah 2012-02-29 06:12:54

+0

它不是以重复开始。通常情况下,被调用的内容会导致它重复。基本上,它开始作为指针的副本,允许您自由编辑对象。但是,如果您要重新调整它,您实际上正在处理一个新的对象,而不是重新分配原始对象 - 如果这是有道理的。 – 2012-02-29 06:16:32

+0

是的,如果我要重新声明它,那么我当然会处理一个不同的对象......但是我没有在我能看到的任何地方重新声明它。也许是时候让细齿梳出来了。 – Ozzah 2012-02-29 06:20:11

相关问题