VBでブロックを作って変数のスコープを狭くする(C#の {} みたいに)

こういうの、やっていいのかどうかわかんないけど。

C#のブロック

C#では、コードを {} でくくるとそこがブロックになって、変数のスコープをその範囲に限定できる。ListViewに複数のアイテムを追加するときとかに便利。

{
    ListViewItem item = listView1.Items.Add("item1");
    item.SubItems.Add("item1-a");
    item.SubItems.Add("item1-b");
    item.SubItems.Add("item1-c");
}
{
    ListViewItem item = listView1.Items.Add("item2");
    item.SubItems.Add("item2-a");
    item.SubItems.Add("item2-b");
    item.SubItems.Add("item2-c");
}
{
    ListViewItem item = listView1.Items.Add("item3");
    item.SubItems.Add("item3-a");
    item.SubItems.Add("item3-b");
    item.SubItems.Add("item3-c");
}

3件のアイテムを追加しているけど、変数名はどれもitem。{} でくくったのでそれぞれのスコープが別々になり、変数名が衝突しない。

リストやxmlとかを構築しているときに、1つの長いメソッドの中で同じような名前の変数をたくさん使う場合、こういうブロックを使ったりする。ブロックを使わないと、衝突しないような長い名前を付けるか、同じ変数を再利用することになる。どっちも可読性を失うと思う。

VBには無いからムリヤリ

こういう文法がVBには無い。と思う。探したけど無かった。

ただ、ブロックを作ることはいくらでもできる。

If True Then
    Dim item As ListViewItem = ListView1.Items.Add("item1")
    item.SubItems.Add("item1-a")
    item.SubItems.Add("item1-b")
    item.SubItems.Add("item1-c")
End If

Do
    Dim item As ListViewItem = ListView1.Items.Add("item2")
    item.SubItems.Add("item2-a")
    item.SubItems.Add("item2-b")
    item.SubItems.Add("item2-c")
Loop Until True

With 0
    Dim item As ListViewItem = ListView1.Items.Add("item3")
    item.SubItems.Add("item3-a")
    item.SubItems.Add("item3-b")
    item.SubItems.Add("item3-c")
End With

無駄なIf、無駄なDo-Loop、無駄なWith。どれもブロックなので変数のスコープが限定され、C#の {} と同じようになる。無駄なFor i As Integer = 0 To 0でもできるけど、さすがに無駄すぎるので省略。

With 0 にした

いろいろ考えたんだけど、結局With 0を使うことにした。IfやDo-Loopは本来の意味で使うことがあるけど、Withは本来の意味で使うことはまず無い。だから誤解が少ないと思った。

あと、Withのうしろは別に0じゃなくても、1でも100でも""でもNothingでもいい。オブジェクトならなんでもいいと思う。ただ、無意味なんだよということをわかって欲しいので、0にしてみた。もっといいのを思いついたら変えるかも知れないけど。

Do-Loopだと途中で抜けれる

結局Withを使うことにしたけど、Do-Loopを使った場合は途中でExit Doでブロックを抜けることができるという特徴がある。そういうのを使いたい場面があるかも知れないので、一応覚えておくといいかも。