2010-11-24 8 views
2

VB.NET 2010、.NET 4VB.NETなぜこのサブルーチンはこのように宣言されていますか?

は、私は基本的な疑問を持っている:

Public Sub MyFunction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T)) ... 

私は(Tとして約思ったんだけど:私はどこかにオンラインthusly宣言したサブルーチンを持っていますコントロール)サブの名前の後の宣言の一部。私は(Tのうち)Tは、コントロールの種類を指定することにし、アクションの後半で使用されていることがわかりますが、なぜそれがこのように行われているだけではなくやって:

Public Sub MyFunction(ByVal Control As Control, ByVal Action As Action(Of Control)) ... 

サブの名前の後にその部分が何を意味するのでしょうか?その目的は何ですか?ありがとう、私の無知のために申し訳ありません。

答えて

2

(Of T)は汎用型パラメータであり、As Controlを追加すると、TのタイプがControlから継承するように制約されます。メソッドを2番目の方法で記述することはできますが、継承された型、アクションのラムダ式、またはMyFunctionの本文にControlをキャストする必要が生じる可能性があります。ジェネリックスはそれを避けることができます。例えば

Sub Main() 
    Dim form As New Form() 

    Dim textBox As New TextBox 
    Dim listBox As New ListBox 

    MyFunction(textBox, Sub(c) c.Text = "Hello") 
    MyFunction(listBox, Sub(c) c.Items.Add("Hello")) 

    MyFunction2(textBox, Sub(c) c.Text = "Hello") 
    MyFunction2(listBox, Sub(c) CType(c, ListBox).Items.Add("Hello")) 


End Sub 

Public Sub MyFunction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T)) 
    Action(Control) 
End Sub 

Public Sub MyFunction2(ByVal Control As Control, ByVal Action As Action(Of Control)) 
    Action(Control) 
End Sub 

それは些細な例では、あまりにも貴重な見ていませんが、それは、より複雑なケースのための非常に貴重です。

+0

私は参照してください。好奇心のために、イベント処理サブルーチンのシグネチャがこれを持っていないのはなぜかと思います。 Private Sub Control_Click(Of T As Object)(ByVal送信者としてT、ByVal eをEventArgsとして)などの機能を実行できると思うので、そのプロパティにアクセスしたい場合は必ず「送信者」をキャストする必要はありません。それとも意味がありませんか?応答していただきありがとうございます。 –

+0

細かいことをありがとう。 –

+0

デリゲートの呼び出し元、Control_ClickはButton(または他のコントロール)であり、コントロールのprotected OnClickメソッドはデリゲートControl_Clickを呼び出します。 Tの型を知る必要があるので、コントロールが宣言されたときに型Tをパラメータとして渡す必要があります。基本的には、コントロールを書き直す必要があります。ただし、一般的なデリゲートを公開することはできます。詳細はこちら:http://stackoverflow.com/questions/3126886/how-to-declare-generic-event-for-generic-delegate-in-c –

3

VB.NETのgeneric method宣言構文です:ジェネリック型は データ型のさまざまな 同じ機能を実行するために適合させ、単一のプログラミング 要素である

。汎用の クラスまたはプロシージャを定義する場合は、 の各データタイプに対して別々のバージョンを定義する必要はありません。 でその機能を実行することができます。

類推は、 リムーバブルヘッドで設定されたドライバーです。ネジ を調べて、そのネジ(スロット付き、 、スター付き)の正しいヘッドである を選択して選択する必要があります。ドライバーの ハンドルに の正しいヘッドを挿入したら、ドライバーでまったく同じ 機能を実行します。つまり、 ネジを回します。

+0

クイックレスポンスとアナロジーをありがとう! –

1

他の人からも言われているように、それは制約のある一般的なパラメータです。しかし、誰が、まだあなたの質問のこの部分に対処していない:

は、なぜそれが答えはアクションであるこのよう

が行われます。それはちょうどコントロールとして宣言された場合ではないすべてのコントロールが.textの性質を持っているので、あなたは、このような何かを行うことができないだろう*

MyFunction(MyTextBox, Function(t) t.Text = "new value") 

関数の本体は、単に知っている必要がありますそれは何らかの種類のコントロールを処理していますが、関数に渡すAction(Of T)は実際のコントロールの種類を知りたいかもしれません。

はい、すべてのコントロールに.Textプロパティがあります。いくつかはしなかったというふりをしましょう。

+0

私は参照してください。それは基本的に私の質問でした。 –

関連する問題