C# - 调用此泛型方法的两种方法.有什么区别吗

本文关键字:方法 什么 区别 两种 调用 泛型方法 | 更新日期: 2023-09-27 17:56:53

我使用此代码从另一个 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实例化是否有(如果有区别)或者只是一回事?

C# - 调用此泛型方法的两种方法.有什么区别吗

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

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

后期编辑:坦率地说,正如亨克·霍尔特曼所说,你滥用了 ref 的使用。

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

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

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

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

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

那么使用 T 临时实例化是否有(如果有区别)或者只是一回事?

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

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