-2

我使用此代码从另一个 MDIchild 表单中加载 MDIchild 表单。我仍在学习如何在我的方法中使用泛型,所以当我在这里的人们的帮助下最终让我的方法工作时,我会用两个稍微不同的代码结束你,在我的情况下,它们的工作方式相同。所以我的问题是——这两种变体做同样的工作是巧合,还是两种方法之间没有区别。

所以这里是版本 1:

protected void LoadAForm<T>(ref T sendTo) where T : Form
{
    MainForm frm = this.MdiParent as MainForm;
    if (frm != null)
    {
        sendTo = SingletonFormProvider.GetInstance<T>(frm, true);
        sendTo.MdiParent = frm;
        sendTo.Dock = DockStyle.Fill;
        sendTo.Show();
    }
}

这是第 2 版:

protected void LoadAForm<T>(ref T sendTo) where T : Form
{
    MainForm frm = this.MdiParent as MainForm;
    T temp;
    if (frm != null)
    {
        temp= SingletonFormProvider.GetInstance<T>(frm, true);
        temp.MdiParent = frm;
        temp.Dock = DockStyle.Fill;
        temp.Show();
    }
}

那么使用实例化是否有(如果有任何区别)T temp或者它只是同一件事?

4

2 回答 2

3

这与泛型无关。这是关于ref参数的(错误)使用。

那么使用 T temp 实例化是否有(如果有任何区别)或者它只是同一件事?

在这种方法内部没有区别。但是在调用之后,传递给 'sendTo' 的参数将被版本 1 更改,并且在使用版本 2 时保持不变。

从这段代码中无法猜出哪个是正确的。

于 2013-02-01T10:27:36.887 回答
3

主要区别在于,在第二种情况下,您新创建和显示的表单在您的 sendTo 参数中的 LoadAForm 之外将不可用。第一种方法似乎工作正常,通过将引用参数传递给它来完成它的预期目的。

另一种自然的方法是将新创建的作为函数返回值形式返回,而不是通过引用参数返回它。

后期编辑:坦率地说,正如 Henk Holterman 所说,您在滥用 ref 用法。

顺便说一句,如果您仍想将参数传递给该方法,请使用out而不是ref

好的,这就是我的意思:像这样声明你的方法:

protected T LoadAForm<T>() where T : Form

并返回您刚刚实例化的表单。简单的。

于 2013-02-01T10:27:58.490 回答