2

VB.NET 2010、.NET 4

基本的な質問があります。オンラインのどこかでこのように宣言されたサブルーチンがあります。

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

サブの名前の後の宣言の(Of T As Control)部分について疑問に思っています。Tは、後でControlのタイプの指定とAction(Of T)で使用されることがわかりますが、なぜそれが単に実行するのではなく、このように実行されるのですか?

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

潜水艦の名前の後のその部分はどういう意味ですか?その目的は何ですか?どうもありがとう、そして私の無知をお詫びします。

4

3 に答える 3

3

これは、VB.NETのジェネリックメソッド宣言構文です。

ジェネリック型は、さまざまなデータ型に対して同じ機能を実行するように適応する単一のプログラミング要素です。ジェネリッククラスまたはプロシージャを定義する場合、その機能を実行する可能性のあるデータ型ごとに個別のバージョンを定義する必要はありません。

例えは、取り外し可能なヘッドを備えたドライバーセットです。回転させる必要のあるネジを調べて、そのネジの正しい頭を選択します(スロット、クロス、スター付き)。ドライバーのハンドルに正しいヘッドを挿入すると、ドライバーとまったく同じ機能、つまりネジを回すことができます。

于 2010-11-24T01:47:46.077 に答える
2

(Of T)はジェネリック型パラメーターであり、As Controlを追加すると、Tの型がControlから継承するように制約されます。2番目の方法でメソッドを作成することもできますが、おそらく、アクションのラムダ式内、またはMyFunctionの本体内で、継承されたタイプにコントロールをキャストする必要があります。ジェネリックスを使用すると、それを回避できます。

例えば:

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

些細なケースではあまり価値がないように見えますが、より複雑なケースでは非常に貴重です。

于 2010-11-24T01:49:24.970 に答える
1

他の人が言っているように、それは制約されたジェネリックパラメータです。しかし、まだ誰もあなたの質問のこの部分に取り組んでいません:

なぜこのように行われるのですか

答えは行動にあります。コントロールとして宣言されたばかりの場合、すべてのコントロールに.Textプロパティがあるわけではないため、このようなことはできません*

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

関数の本体は、ある種のコントロールで動作していることを知る必要がありますが、関数に渡すAction(Of T)は、コントロールの実際のタイプを知りたい場合があります。

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

于 2010-11-24T01:55:51.663 に答える