VB のたまご

作成日: 2017/04/07, 更新日: 2017/04/07


C#で()=>{}は、VBだとどう書くのか?

  •  ふと、C# で書く【() => {};】は、VB ではどう書くのか?という疑問が私の中で浮かび上がってきて、 すごく気になり始めて、集中したい事に集中できなくなってしまったので、調べました。

  •  とても、どうでもいいことですね。

  •  上記の命令は、ラムダ式なのですが VB だとこう書きます(ラムダ式ではなく定義メソッドの場合)。

  • Sub Method1()
    
    End Sub
    

  •  つまりこの命令は、引数無しで戻り値無しメソッドをラムダ式で書いたバージョンになります。

  •  どうやるのか思いつかなくて検索しました。
  •  で、もう忘れてしまいましたが、確か【c# () => {} vb.net】というキーワードで検索したような気がしましたが、今これで検索してもでてこないですねorz。

  •  以下のウェブサービスを見つけたので、利用してみました。

  • Convert Code
    http://converter.telerik.com/
    

    C#
    var act = () => {};
    
    変換結果
    VB.NET
    Dim act = Function() 
    
    End Function
    

  •  ふむふむ、なるほど。
  •  ただ、実際に Visual Studio 上で VB をこう書くと、戻り値を書くように言われてしまいます。 ということで、何パターンか確認してみました。

  • Module Module1
    
        Sub Main()
    
            ' ラムダ式型?
            ' マウスカーソルを当てると、【(ローカル変数) a1 As <Sub()>】と表示される
            Dim a1 = Sub()
                     End Sub
            a1()
    
            ' 以下と同じような違和感を感じる。
            ' メソッド名だけじゃ戻り値(の型が)分からないから、戻り値を受け取る変数には型を書いてくれ!みたいな
            'Dim a1b = GetXxx()
    
            ' マウスカーソルを当てると、【(ローカル変数) a2 As <Function() As Integer>】と表示される
            ' 何かを返さないといけないため、1 を書いた
            Dim a2 = Function() 1
            a2()
    
            ' 違和感が無い書き方はこうかな?デリゲートにラムダ式をセットする形式
            Dim a3 As Action = Sub()
                               End Sub
            a3()
    
            Dim a4 As Func(Of Integer) = Function() 1
            a4()
    
            Dim a5 As Action = Sub() Console.Write("")
            a5()
    
    
            Console.Read()
        End Sub
    
    End Module
    
  •  一番近いのは a1 でしょうね。ただ、a3 のように型を書きたくなるかもしれません。1行で完結したい場合は、a5 のようにごまかし案で書くと思います。 そういえば、ラムダ式をセットした変数を扱うのってやったことないですね。必ずデリゲート経由で扱っていました。

  •  そして、後で気づきましたが、var 宣言だとラムダ式が型推論できないじゃん、書き方間違えた!って気づきましたorz。 正しくは【Action act = () => {};】ですね。

  •  最後までこの記事を読んでいただき、ありがとうございました。