m2

VB.netの不思議

とにかく VB の配列宣言はキモい

とりあえずコレを見てくれ。こいつをどう思う?

        Dim array(5) As String
        Console.WriteLine(array.Length)
        --
        6

設定で変えられるのかもしれないけど、とにかくデフォルトでは「5」で配列宣言すると長さ「6」の配列ができる。どういうことかというと、array(5) と宣言すると 0番目から 5番目までの箱が宣言されたという意味になる。
これは C や Java を長年やってきて、仕事で初めて VB を触る人間にとってはすごく気持ち悪くて、プログラマVB 嫌悪の一因になっていると思う。
同じ理由で、Java と同じように For ループを書くと(最初だけ)痛い目を見る。

        For i As Integer = 0 To array.Length
            Console.WriteLine(array(i))
        Next

array.Length は前述のように「6」を返すので、i が 6 になった時に配列からはみ出してしまう。((これは「For〜To〜Next」文が Java の for文でよく見られる for(i=0; i<array.length;i++){} と等価でなく、for(i=0; i<=array.length;i++){} と等価になるのも原因。))
VB での For ループは一般的に以下のように書く。((間違っても To (array.Length - 1) としてはいけない。いや、してもいいけど僕は恥ずかしくてできない。))

        For i As Integer = 0 To UBound(array)
            Console.WriteLine(array(i))
        Next

VB で配列を宣言する場合は配列の長さを宣言するのではなく、配列の最後の添字を宣言すると理解しよう。

VB の等値比較演算子は代入演算子と同じ「=」だからちょっと混乱するかも

        Dim a As Integer = 1
        Dim b As Integer = 2
        Console.WriteLine(a = b)
        Console.WriteLine(a)
        --
        False
        1

すべて文脈で判断するんだね。すごいね。

  • -

そういや Equals メソッドってあんのかなと思ったらあった。

注意: VB.NET の s1 = s2 は Microsoft.VisualBasic.CompilerServices.StringType.StrCmp を呼び出すそうですが、C# では単に String.operator ==(s1, s2) を呼び出すだけです。

Java と違って比較の「=」では値の比較もやってくれるみたいですね。

ビット演算子も「And、Or」

これも文脈で判断される。以下はダイアログのスタイルの例。

    Dim style As MsgBoxStyle 
    style = MsgBoxStyle.DefaultButton2 Or _ 
        MsgBoxStyle.Question Or MsgBoxStyle.YesNo