0

VB.NETのスニペットを C#に変換するために、あらゆる変換ツールを使用してきました。変換のいくつかの違いを除けば、私が把握するのに苦労しているのは、イベント ハンドラーの変換です。純粋な C# コードを見ると、次のようなことがわかります。

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    ...
}

MSDNを見ると、PreRender イベントが発生します。わかった。ここで、いくつかの VB.NET コードを取り上げます。

Private Sub Page_PreRender(ByVal sender As Object, 
    ByVal e As System.EventArgs) Handles Me.PreRender
....
EndSub

これは同じ PreRender イベントを処理し、それを変換ツール ( DeveloperFusion はイベント ハンドラーの最もクリーンな変換を行うように見えた) で変換すると、次の結果が得られました。

public class MyClass : UserControl
{
    private void Page_PreRender(object sender, System.EventArgs e)
    {
        ...
    }

    public MyClass()
    {
        PreRender += Page_PreRender;
    }
}

これに慣れていないので、私の主な質問は、上記の最初にリストされた元の (または純粋な) C# コードが、変換された C# コードと基本的に同じobject senderかどうかです (部分を除いて)。簡単な説明ではない場合でも、大歓迎です。

本質的に、私はそのPreRender += Page_PreRender;部分が余分であるかどうか疑問に思っています.

4

4 に答える 4

4

最初の C# コード ブロックは基本クラスの関数のオーバーライドを示し、2 番目はイベントへのイベント ハンドラーです。OnPreRenderPreRender

はい、それらは異なりますが、機能的には多かれ少なかれ同等です。なぜなら、あなたが言及したように、基本クラスOnPreRender関数がPreRenderイベントを発生させるからです。

基本的に、これは同じことを達成するための 2 つの方法を表しており、選択するメカニズムは主にセマンティクスの問題です。私が言う主な理由は、ある方法を他の方法よりも選択する明確な理由が存在する可能性があるためですが、何も知らない場合は、いずれかを選択してください.

通常、イベントを使用して、オブジェクトの派生インスタンスではなく外部リスナーに通知をブロードキャストするため、私はオーバーライドを好みます。

そのPreRender += Page_PreRenderメカニズムを使用しているときにイベントハンドラーを接続する必要があるため、この例では不要ではありません。あなたが投稿したVBバージョンは、オーバーライドではなくイベントを使用して実装されているため、変換は正しいです. これらのイベントの「接続」は VB.net では暗黙的であるため、VB バージョンでは同等のステートメントは見つかりません。

于 2013-08-06T15:05:06.670 に答える
1

そのPreRender += Page_PreRender;部分は余分ですか?

いいえ - そのコードはイベント ハンドラーを割り当てる C# の方法であり、これは VB でHandles Me.PreRender句を使用して行われます。

于 2013-08-06T15:05:59.217 に答える
1

変換は正しく行われましたが、元の C# と同等ではありません。

MSDN を見ると、 PreRenderイベントが発生します。

元のコードはハンドラーではなく、インボーカーです。OnPreRenderをレイズするように呼び出されPreRenderます。VB コードが で発生PreRenderした場合、Page_PreRender無限再帰が発生します。

オーバーライド可能な「On[イベント名]」パターンは、サブクラスがイベントを「処理」できるようにするために使用されますが、ハンドラーとは異なります。base/への呼び出しMyBaseは実際にイベントを発生させるものであるため、基本的にこれらのメソッドの 1 つをオーバーライドすることで、すべてのイベント ハンドラーが呼び出される前または後に (ベースを呼び出す場所に応じて) アクションが完全に発生するように強制します。

于 2013-08-06T15:24:35.720 に答える