VB2008の小さなお宝
米国MicrosoftでVB作ってるチームが、The Visual Basic Team って社員blogをやっておりまして。
Microsoft系プログラミングの教本ともいえる msdnLib 、公式な発言がきちんと詰まっている公式サイトなどには載っていないような切り口の最新情報やら小ネタやらウンチクやらがもー満載。
このMicrosoft社員blog、いろんな立場やスタンスを持つ人やらチームやらがあっちこっちで書いていますので、開発言語に限らず日頃使っているMicrosoft製品やら技術やらに関わるblogを探して呼んでいると意外な発見がけっこうあったりします。
まあ基本的には英語なのがなんですが、翻訳サービスのお世話になってでも読む価値ありだと思います。
さてそんなVBチームblogですが。
せっかくVB2008が出たってぇのに、やれLINQだWPFだと営業的に大トピックばかり取り上げられるのにちょいと食傷してきまして、作り手としてはどのへんをイバりたいんだい?とざっくり読んでみました。
おおお、あるある。期待にぴったり合ったエントリが書かれていましたよ。
The Visual Basic Team : Hidden Gems in Visual Basic 2008 (Amanda Silver)
「VB2008の隠れたお宝」ですってよ。
つことで以下、そのお宝がそれぞれなんなのか、関連リンクも含めてちょっとご紹介。
2008.01.22 : お断り
本エントリはあくまでも、上記リンク先で取り上げているVB2008の新機能を、日本語としてのキーワードや概要を把握できるリンクを交えてさるべーじが紹介したものです。
元エントリを翻訳したものではなく、またところどころの引用も大変怪しい精度であることをお断りしておきます。
0) .NET Framework 2.0/3.0/3.5 マルチターゲット
VB2008だけで、NET Framework 2.0(VB2005)、3.0(VB2005+Vista)、3.5(VB2008)それぞれに対応したプログラムが作れちゃうぜー、と。
.NET Frameworkは3.5が完全に3.0を内包、3.0が2.0を完全に内包していますので、使える機能に制限をかければそれぞれのバージョン用のプログラムができてしまうんだぜー、というからくりで。
でもVB2008に付属する.NET Framework3.5に含まれる2.0/3.0はSP1なので、今SPなしVB2005で開発しかけのものをそのまま移行させるわけにはいきませんね。
Standard以上のEditionでは「新しいプロジェクト」ダイアログに.NET Frameworkバージョンの選択コンボボックスが表示されるので、バージョンを指定してプロジェクトを作ることができるんですけれども、Express Editionではこのコンボボックスはありません。新規作成したプロジェクトは必ず.NET Framework3.5ようになります。
Express Editionはそうやっていったんプロジェクトを作ってから、そのプロジェクトのプロパティ画面で切り替えるという手順を踏むことになります。
1) 型の推定 (Type Inference)
「プロトタイプなんかがすばやく、簡単に、しかもタイプセーフに作れちゃうんだぜー」
このへんはmsdnマガジンオンライ日本語版2007年10月号の 基本的な本能: Visual Basic 2008 における型の推定 — MSDN Magazine, October 2007 あたりがわかりやすいと思います。
2) If演算子 (If Operator)(三項演算子:Ternary operator)
IIfと違ってタイプセーフだし、Falseの方の計算式は計算されないといいこと尽くめ。
「型の変換と組み合わせると、If演算子がどんな型を返すつもりなのかも簡単にわかっちゃうんだぜー」
あまりきちんとした言及はまだどこもしてないっぽいです。のでとりあえずmsdnLibから If 演算子 を。
msdnLibも今回のバージョンから、文体も字面もずいぶんとわかりやすく読みやすくなっています。
3) オブジェクト初期化子 (Object Initializers)
βや先取り情報で学んでいた方なんかは「オブジェクトイニシャライザ」という言い方で耳なじんでいると思うんですが。
オブジェクト初期化子 : 名前付きの型と匿名型 によると、どうも正式な日本語での呼称は「オブジェクト初期化子」になったっぽいですね。
考え方は Visual Basic 9.0 概要 – オブジェクトとコレクションの初期化 あたりが簡潔。
4) null許容値型 (Nullable)
Nothingな状態を許容するデータ型拡張。
「= Nothing」では正常に判定されなくて「Is/IsNot Nothing」を使ってくれみたいなシバりがあって、「VB Nullable」あたりで検索かけるとそのへんを検証したblogエントリがけっこう出てきます。
が、これはVBなんだぜ?「IsNothing( )」てのも検証したいんですぜ?
検索でヒットするページは「ワカってる前提での記述」が多く、これからワカりたい人のためにはあんまりまとまった説明が見当たりません。
やっぱmsdnLibの null 許容値型 あたりがわかりやすいかと。
あと Visual Basic 9.0 概要 – Nullable 型 とか。
5) DataSetへのLINQ
LINQについてはかなり取り上げられているので、特にここで入門ページ提示しなくてもいいですよね。
つかWebページひとつでさくっと把握できるようなシロモノではありませんので、それなりの書籍を1冊読んでおいた方がいいのではないかと。
6) 構文ヒント (Syntax Tooltips)
「クールだろ?」「どう思う?」って(^^;)、まぁ確かに見りゃわかるわけですが。
確かにVB2008ではほしい情報が的確に表示されるように改善されています。
VB2005の時も重宝していましたが、VB2008に慣れると、以前のツールチップがときどき的外れな情報を提示しているなーと思うようになってきます。
7) IntellisenseのXML名前空間サポート (XML Namespace support in Intellisense)
VBコードの中に直接XMLタグを書くようなご時世になってきたので、そこらへんでもIntellisense効くようにしてみたよー、ってとこでしょうか。
msdnLibの説明がほんっといいなぁ、今回。Visual Basic における XML IntelliSense
8) 型定義へ移動 (GoTo Type Definition)
「型の推定」とセットの機能なんですけれども。
従来「Dim i As Integer = 0」なんてのがあって、型の委細を調べたい時には「Integer」上で右クリック→「定義へ移動」とかやっていたんですけれども、今回から「As ~」の部分は記述を省略できるようになってしまったわけで。
そんな時に型を調べたい、定義の記述を参照したいなんて場合には、変数名の上で右クリック→「型定義へ移動」で一発ジャンプ。
宣言行だけでなく、例えば「i = ii + iii」なんて計算式があったら、「i」「ii」「iii」のそれぞれ一気に型定義に飛べます。
9) ループ変数にも型の推定 (Type inference for loop variables)
For~とかFor Each~で使うワーク変数の型を省略できるようになりました。
従来だとStrict Offにした上でみなしVariantだったのが、きちんと型推定でそれなりの型になりますよ、と。
なんてことはない機能ですが、いちいちAs句に指定する型を探さなくいい(特にFor Eachの場合はそれなりにめんどい)とか、記述が短くなる(特にVBは.NET系言語でもっとも記述が長くなりやすい)とか、地味に便利さが沁みてきます。
10) バックグラウンドコンパイラ
えーと、ビルド処理がバックグラウンドで行われるようになったので、ビルド中も作業ができるみたいに読めるんですけど、って理解でいいのかな。
例えば5分かかるビルドで100のエラーが出るとして。
最初の5つのエラーが表示された段階で、残り部分のビルドを実行しつつソースの修正を始められるならこりゃすんごいことですけれども。
実際、そんなにビルドに時間のかかるプロジェクトを今持っていないので試せませんすいません。
そのうち無意味にデカいプロジェクトでも作って試してみたいと思います。
同じく The Visual Basic Team : Visual Basic 9.0 Language Specification Released (Beth Massi) にも、おもしろいトピックがメモされています。
とりあえずこちらは日本語訳とmsdnLibへのリンクのみ。
- フレンドアセンブリ (Friend assemblies)
- 厳密でないデリゲート変換 (Relaxed delegates)
- ローカル型の推論 (Local type inferencing)
「Type Inference」に「型の推定」「型の推論」と2種類の訳語があるのはいかがなものかと。 - 匿名型 (Anonymous types)
- 拡張メソッド (Extension methods)
- クエリ式 (Query expressions:Visual Basic における LINQ の概要)
- 式ツリー (Expression trees)
- ラムダ式 (Lambda expressions)
- 部分メソッド (Partial methods)
つか訳語がずいぶん不統一くさいんですけどどうしましょう。
おまけ。
Visual Studio Magazine Online | Enterprise Solutions for .NET Development

こんにちは。
これはありがたいです。ただいま勉強中の身としては大変参考になります。
9だけは「スコープが見難くなるんじゃね?」とか思ったんですが、7のリンクのちょっと上に書いてありました。For Dim(またはFor Each Dim)という書き方が追加されたんですね。
ピンポイントで重要なトピックが学べて大変助かりました。今後ともがんばってください。
Type Inferenceは型推論が適当だと私は思います。
[理由]
・型推論の方が人気(Googleで型推論と型推定で検索)
・辞書サイトの英和辞典によるinferの意味は”推論する”(goo、ALCで調査)
- 実は、和英の推論、推定共にinferが含まれます(^^; しかし、推定に対する、より適切な英語はestimateだと思うので、inferに対する訳語として推定はニュアンスが違うと思う。
・推論と推定では推定の方がおおざっぱなニュアンスがあるようだ
以上の理由により変数の型を代入される値から決定する機能は推定というより推論ではないかと思います。
> For Dim(またはFor Each Dim)という書き方が追加
しまったそれは「Visual Basic 9.0 概要」のお話ですよね。
あれは2005年に書かれた,その時点でのVB9への追加機能の概念でして、製品として提供されたVB2008(VB9)の実装とはびみょーに異なっているんです。
For Dim/For Each Dimという書き方は確かVB2008製品版ではなくなっているはずです。
(すいません、今手元にVB2008がないのでうろ覚えです。)
リンク先、変えといた方がいいかなー…
> 型推論が適当だと
同意です。
ただ、一般論としてであればそれでいいんですが、Microsoft製品が実装している機能として「日本語では公式になんと命名されているか」を知っておきたいんですよ。
で、msdnLibのページによって訳が違うので困っちゃった次第です。
と思いきや、こんなページをさっき見つけました。
Visual Studio と .NET Framework の用語集
しっかり型の推論 [type inference]と書いてあります。
VB2008のGlossary出るまで判断留保しようかと思ってたんですが、「用語集」で記述されているならこれを公式と考えていいかなーというところです。
つことで私は以降、こやつを「型の推論」と呼んでいくことにします。
# 「型推論」の方が文章内で使いまわしやすいんですけどね…(;-;)
> For Dim/For Each Dimという書き方は確かVB2008製品版ではなくなっているはずです。
試したら使えませんでした。
むー、となると「Visual Basic 9.0 概要」という文書は当てにならないわけですね。
MSDNってこういうのが多くて困るんですよねぇ。機械翻訳されていない日本語文書は内容が古かったり表記がゆれていたり・・・。
やはり英文側を読まないとだめですね。
あー手抜きできると思ったのにー。残念です。
Forループ変数のスコープはそのFor文外部と関係を持たないのがあたりまえになりつつあるんでしょうかね。
まあこのへんで引っかかっていてもしょうがないので悩まないことにしよう。