Hatena::ブログ(Diary)

m2

2006-11-06

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 になった時に配列からはみ出してしまう。*1
VB での For ループは一般的に以下のように書く。*2

        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
.NET Framework 開発者ガイド - 方法 : デバイスをリセットする

*1:これは「For〜To〜Next」文が Java の for文でよく見られる for(i=0; i<array.length;i++){} と等価でなく、for(i=0; i<=array.length;i++){} と等価になるのも原因。

*2:間違っても To (array.Length - 1) としてはいけない。いや、してもいいけど僕は恥ずかしくてできない。