これをどのように VB に変換しますか (.NET 4.0 / VS2010 を使用) ?
bw.DoWork += (o, args) =>
{
Code Here
};
私は多分このように思った:
AddHandler bw.DoWork,
Function(o, args)
Code Here
End Function
ただし、関数はすべてのコード パスで値を返すわけではありません。
アイデア?
これをどのように VB に変換しますか (.NET 4.0 / VS2010 を使用) ?
bw.DoWork += (o, args) =>
{
Code Here
};
私は多分このように思った:
AddHandler bw.DoWork,
Function(o, args)
Code Here
End Function
ただし、関数はすべてのコード パスで値を返すわけではありません。
アイデア?
そのようにすることはできませんが、次のように機能させることはできます。
Sub New()
AddHandler bw.DoWork, AddressOf Stuff
End Sub
Sub Stuff(ByVal o, ByVal args)
' Code Here '
End Sub
基本的に、コードを呼び出すイベントを追加し、ルーチンに渡されたパラメーターを除いて、イベントが値を返すことはありません。それはそれを関数ではなくサブにします。
.NET 4.0を使用してSubwayを試しましたが、エラーは発生しません
AddHandler bw.DoWork,
Sub(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
'Code(Here)
End Sub
問題は、「CodeHere」が何をするのかを知る必要があるということです。関数は値を返す必要があります(Returnステートメントがあります)。値を返したくない場合は、関数をサブにする必要があります。
2010年までマルチラインラムダを取得しません。VB9でマルチラインを変換する必要がある場合は、いくつかの回転を行う必要がありますが、それは可能です。最終的には、ホルダーオブジェクトを作成し、そのオブジェクトにプロパティを設定してから、共有関数を呼び出す必要があります。これは、C#の場合ほどエレガントではありません。
VBNET2008 でラムダ式を使用しようとしたときに、似たようなものに出会いました。
キーワード Function は、ラムダ式が使用されていることをコンパイラに示すために使用されるため、式は値を返す必要があります。このシナリオでは、キーワード Sub を使用する方が適切ですが、VBNET2008 ではまだ使用できません。
VBNET2010 は、ラムダ式内で Subs を許可することでこれに対処する必要があります。
SOに関するこの質問で私にとってうまくいった回避策の例を次に示し ます。このC#に相当するVB.NETコードは何ですか...
つまり、ラムダ式をメソッドのコアに記述する代わりに、AddressOf Sub を使用して作業を実行する Sub をポイントする必要があります。
David Parvin も、必要に応じて回避策を書いています。
編集:
いつでもデリゲート ソリューションを選択できます。プライベート デリゲート サブ MyMethodAsync()
Public Sub Button1_Click(...) Handles Button1.Click
Dim myMethodAsync As MyMethodAsync = AddressOf MyDoWorkAsync
_myBackgroundWorker.RunWorkerAsync(myMethodAsync)
Dim loadingForm = New LoadingForm()
loadingForm.ShowDialog()
End Sub
Private Sub _myBackgroundWorker_DoWork([parameters here...]) Handles _myBackgroundWorker.DoWork
' Do some stuff...
End Sub
無名メソッドではないことはわかっているので、2008 年であっても VBNET でこの方法で作業しようとするのは非常に難しいかもしれません。しっかりと確認するのに十分な自信がありません。
お役に立てれば!