-2

このコードを使用して、別の MDIchild フォーム内から MDIchild フォームをロードします。私は自分のメソッドでジェネリックを使用する方法をまだ学んでいるので、ここの人々の助けを借りて最終的にメソッドが機能するようになると、私の場合は同じように仕事をするわずかに異なる2つのコードで終わります。だから私の質問は - これらの 2 つのバリエーションが同じ仕事をするのは偶然なのか、それとも 2 つのアプローチに違いがないだけなのかということです。

したがって、ここにバージョン 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

主な違いは、2 番目のシナリオでは、新しく作成されて表示されたフォームは、sendTo パラメータの LoadAForm の外では使用できないことです。最初の方法は正しく機能しているようで、参照パラメーターを渡すことで目的を達成しています。

別の自然な方法は、ref'ed パラメーターを介して返すのではなく、関数の戻り値フォームとして新しく作成されたものを返すことです。

後の編集: 率直に言って、Henk Holterman が言ったように、あなたは ref の使い方を誤用しています。

ちなみに、それでもそのメソッドにパラメーターを渡したい場合は、 refの代わりにoutを使用してください。

わかりました、これが私が言いたいことです: 次のようにメソッドを宣言します:

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

インスタンス化したばかりのフォームを返します。単純。

于 2013-02-01T10:27:58.490 に答える