ページ

2005年6月20日月曜日

Re: VB2005 ではフォームをインスタンス化しなくて良い

じゃんぬねっと日誌: 「VB2005 ではフォームをインスタンス化しなくて良い」 でもりあがってた話題ですが、VB2005 って、


Form1.Show()


なんてことができるんですね。ここの Form1 っていうのがクラス名であってインスタンス名じゃないってとこがミソですね。


んで、当然のことながらどうやってるのか気になるところ。さっそく ildasm で見てみました(笑)
VB2005 の Form1.Show() の 1行によって生成された IL を C# 風に書いてみると


My.MyProject.MyForms forms = My.MyProject.get_Forms();
Form1 frm = forms.get_Form1();
frm.Show();


という感じになっています。


なるほどねぇ。やっぱり My なんですねぇ。
My の中の MyProject には Forms っていう MyForms クラス (のインスタンス) を返すプロパティがあるんですね。そして、MyForms には Form1 というプロパティがあると。で、この Form1 プロパティは Form1 クラスのインスタンスを返すと。ちなみに、この Form1 プロパティは常に同じインスタンスを返すようです。なので、Form1.Show() を 2回やったからといって 2つのフォームが開くわけではありません。


ここで重要なのは MyForms クラスは .NET Framework にあらかじめ用意されているわけではなく、プロジェクトにあわせてその場で作られてるってところですね。My.MyProject.WebServices も同じような感じです。


私は、これが My の My たるところだと思ってます。普通の処理であれば C# で 「My もどき」 を実装することだって特に問題はないはずです。しかし、こういう風に 「プロジェクトにあわせてプロジェクトごとに自動的に作られる」 部分はどうしようもないんですよね。「VB's *My* for C# Developers」 に 「My もどき」 の That というクラスを C# で実装するという記事がありますが、ここでも My.MyProject の部分は含まれていないようです。たぶんこれを何とかするには Visual Studio のマクロなどを使って動的にソースを生成するとかしないとどうしようもないんじゃないかと思います。


で、VB2005 では Visual Studio が My.MyProject の部分をうまいことやってるのか、それとも、VB コンパイラのレベルでなんとかしているのかは調べていません(VS を使わずに vbc でやってみればわかることですが)。

1 件のコメント:

  1. インテリセンスかVSのもってるクラスツリーを元にCodeDOMでほげってやれば簡単っぽいけど、vbprojはmsbuildでビルドできないって事になりそうで… orz

    buildステップをちょっと追ってみますよ。

    返信削除