DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■34372 / inTopicNo.1)  ラムダ式の勉強中
  
□投稿者/ VBはじめました 一般人(17回)-(2019/11/07(Thu) 10:24:48)
  • アイコン環境/言語:[VisualStudio2017 VB.net] 
    分類:[.NET] 

    ラムダ式の勉強をはじめました(下記のコードに対する質問)
    (質問1)
    コメントの@とAをDelegateで書くと、@−DとA−Dの形になると
    思いますが、あってますか?(動作は確認したのでなんとか同じ動きになります)
    もっと、適切な書き方があれば教えてください。

    (質問2)
    コメントの@を1行で書くと、@-1行になるとおもいますが、
    Aを1行で書くことはできない。であってますか?
    https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/procedures/lambda-expressions
    を見ると、ラムダ式は、ステートメントに含める必要があると記載されているので
    1行で書けないと考えたのですが、あってますか?

    Public Class TestClass
    Sub Test()
    Dim increment1 = Function(x) x + 1 '@
    Console.WriteLine(increment1(1))

    Console.WriteLine((Function(num As Integer) num + 1)(1)) '@-1行

    Dim writeline1 = Sub(x) Console.WriteLine(x) 'A
    writeline1("Hello")

    '@をDelegateで書いたもの
    Dim increment As New DelegateTest_TestClass
    Dim d1 As TestDelegateF = AddressOf increment.Method1 '@-D

    Console.WriteLine(d1(1))
    Dim d3 As SampleDelegateS = AddressOf increment.Method3 'A-D
    d3("Hello")
    End Sub
    End Class
    Public Delegate Function TestDelegateF(x As Integer) As Integer
    Public Delegate Sub TestDelegateS(x As String)

    Public Class DelegateTest_TestClass
    Public Function Method1(x As Integer) As Integer
    Return x + 1
    End Function
    Public Sub Method3(x As String)
    Console.WriteLine(x)

    End Sub
    End Class
マルチポストを報告
違反を報告
引用返信 削除キー/
■34373 / inTopicNo.2)  Re[1]: ラムダ式の勉強中
□投稿者/ 魔界の仮面弁士 大御所(1253回)-(2019/11/07(Thu) 14:11:35)
  • アイコンNo34372に返信(VBはじめましたさんの記事)
    > ラムダ式の勉強をはじめました(下記のコードに対する質問)
    投稿モードが「通常モード」の場合、HTML の特性上
    連続した空白が一つにまとめられ、行頭空白は失われます。

    コード内のインデントを残す場合は、投稿時に
    「図表モード」を選択してください。


    > コメントの@とAをDelegateで書くと、@−DとA−Dの形になると
    > 思いますが、あってますか?(動作は確認したのでなんとか同じ動きになります)

    いいえ。x のデータ型が明示されていないので、@のコードは
    Option Strict On モードではコンパイルエラーになりますし、
    Option Strict Off では、x が As Object としてコンパイルされます。

    そのため、@に相当するデリゲートの引数と戻り値は
      (x As Integer) As Integer
    ではなく
      (x As Object) As Object
    です。


    > もっと、適切な書き方があれば教えてください。

    @で、引数と戻り値が Integer であることを明示するために、
    下記のように書くことができます。

    Dim increment1 = Function(x As Integer) x + 1
    Dim increment1 As TestDelegateF = Function(x As Integer) x + 1
    Dim increment1 As TestDelegateF = Function(x) x + 1
    Dim increment1 As Func(Of Integer, Integer) = Function(x) x + 1



    > Dim d3 As SampleDelegateS = AddressOf increment.Method3 'A-D
    > Public Delegate Sub TestDelegateS(x As String)

    SampleDelegateS というのは
    TestDelegateS の誤記でしょうか。


    提示されたコードでは、クラスのインスタンスメソッドを割り当てていますが、
    Module 内のメソッドや Shared なメソッドを割り当てることもできます。

    Dim method As Action = AddressOf Console.WriteLine


    またイベントハンドラと同様、一つのデリゲートに複数のメソッドを割り当てることもできます。

    Sub Main()
      Dim method = DirectCast(System.Delegate.Combine(
        New System.Action(Sub() System.Console.WriteLine("ABC")),
        New System.Action(AddressOf System.Console.WriteLine),
        New System.Action(Sub() System.Console.WriteLine("XYZ")),
        New System.Action(AddressOf Now.ToString),
        New System.Action(Sub() MsgBox("マルチキャストデリゲート"))),
        System.Action)
      method()
    End Sub


    > (質問2)
    > コメントの@を1行で書くと、@-1行になるとおもいますが、
    > Aを1行で書くことはできない。であってますか?

    Aを単行とするなら、このように書けます。

    Call (Sub(x) Console.WriteLine(x))("Hello")
違反を報告
引用返信 削除キー/
■34374 / inTopicNo.3)  Re[2]: ラムダ式の勉強中
□投稿者/ VBはじめました 一般人(18回)-(2019/11/07(Thu) 18:27:55)
  • アイコン魔界の仮面弁士さん

    いつも、丁寧に有難う御座います。
    色々、ググって整理したつもりが、スカスカでした。
    VBAで、型を意識する癖がついていないので、苦労しています。

    Call文なんて、言われてみれば、納得できるのですが、思いつきもしませんでした。
    何度も、熟読してものにしたいと考えます。

    本当に、ご丁寧に有難う御座います。

解決み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -