21

次の VB.Net コードは、前述の C# コードと同等のものだと思います。ただし、VB.Net テストは失敗します。Lambda を処理するイベントは呼び出されません。

何が起こっている?

VB.Net バージョン - 失敗:

<TestFixture()> _
Public Class TestClass
    <Test()> _
    Public Sub EventTest()
        Dim eventClass As New EventClass
        Dim eventRaised As Boolean = False
        AddHandler eventClass.AnEvent, Function() (eventRaised = True)
        eventClass.RaiseIt()
        Assert.IsTrue(eventRaised)
    End Sub    
End Class

Public Class EventClass
    Public Event AnEvent()
    Public Sub RaiseIt()
        RaiseEvent AnEvent()
    End Sub
End Class

C# バージョン - パス:

[TestFixture]
    public class TestClass
    {
        [Test]
        public void EventTest()
        {
            var eventClass = new EventClass();
            var eventRaised = false;
            eventClass.AnEvent += () => { eventRaised = true; }; 
            eventClass.RaiseIt();
            Assert.IsTrue(eventRaised);
        }
    }

    public class EventClass
    {
        public delegate void EventHandler();
        public event EventHandler AnEvent;
        public void RaiseIt()
        {
            AnEvent();
        }
    }
4

4 に答える 4

22

この質問を今見つけた人のために: Visual Basic 2010 (VB 10.0) 以降、匿名Subs が機能するため、次のように書くことができます:

Sub() eventRaised = True
于 2013-01-06T14:15:30.220 に答える
18

注:これは、Visual Studio 2010 および VB.net 10 より前の古いバージョンの VB.net に関連しています。

違いは、VB.Net ではラムダ式が値を返さなければならない、つまりサブルーチンではなく関数でなければならないことです。ラムダ式eventRaised = trueは、割り当てではなくブール式として解釈されています。つまり、true に設定するのではなく、false に評価されています。

詳細についてはMSDNを参照してください。

この例で使用されているイベントをテストするための c# パターンは、別の関数を導入せずに VB.Net で実行できるとは思いません。

<TestFixture()> _
Public Class Test
    <Test()> _
    Public Sub EventTest()
        Dim eventClass As New EventClass
        Dim eventRaised As Boolean = False
        AddHandler eventClass.AnEvent, Function() (SetValueToTrue(eventRaised))
        eventClass.RaiseIt()
        Assert.IsTrue(eventRaised)
    End Sub

    Private Function SetValueToTrue(ByRef value As Boolean) As Boolean
        value = True
        Return True
    End Function

End Class

Public Class EventClass
    Public Event AnEvent()
    Public Sub RaiseIt()
        RaiseEvent AnEvent()
    End Sub
End Class
于 2008-10-15T14:45:04.233 に答える
2

簡単に言えば、当面はVBでそれを行うことはできません(次のリリースで検討される機能のリストに含まれています)。宣言されたメソッドとAddressOf演算子を使用する必要があります。

VBチームには、言語に匿名のデリゲートを含める時間がありませんでした(これは、技術的にはラムダ式ではなく、使用しようとしているものです)。

Linqが実際に機能するために実装する必要のあるラムダ式。匿名の代理人は何も必要ありません(ただし、非常に便利です)。彼らは、Linq To XMLやXMLリテラールなどをまとめて、構文にさらに多くのクエリ演算子を統合することに多くの時間を費やしたと思います...

于 2008-10-19T05:11:09.517 に答える