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でブロックを抜けることができるという特徴がある。そういうのを使いたい場面があるかも知れないので、一応覚えておくといいかも。