というわけ(?)で、今回も Visual Basic コンパイラ と Visual Studio 2005 の便利機能によって隠された何かを調べてきました。
まず、最初に Visual Studio 2005 を使用して Visual Basic で WindowsApplication プロジェクトを作成します。プロジェクト名は「WindowsApplication1」でいいや。するとご存知のとおり、Form1 クラスの作成までやってくれますね。Form1 のコードを表示してみると、
Public Class Form1
End Class
・・・これだけです。すでに怪しさ全開ですよね?
では次に、Visual Studio 2005 を使用して C♯で WindowsApplication プロジェクトを作成してみましょう。やったことない方も Visual Basic と同じ要領でできます。こちらもForm1 のコードを表示してみると、
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
なにやらいっぱい出てきましたね・・・。一応 Visual Basic で書き直したのがこちら↓
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Namespace WindowsApplication1
Partial Public Class Form1
Inherits Form
Public Sub New()
InitializeComponent()
End Sub
End Class
End Namespace
じっと見つめていると、いくつか分かることがあります。まず、以前のエントリで Sub New は省略してもいけますよ♪ってことはやりました。それと、Partial キーワードとInherits ステートメントは Form1.Designer.vb ファイルのほうにちゃんと書かれています。これらは今回触れないでおきます。
では、ナニが足りないのか・・・って、見るからに 'Imports' と 'NameSpace' がないんですよね。それぞれを検索してみると
MSDN:Imports ステートメント(http://msdn2.microsoft.com/ja-jp/library/7f38zh8x(VS.80).aspx)
MSDN:Namespace ステートメント(http://msdn2.microsoft.com/ja-jp/library/0dx91cw5(VS.80).aspx)
大切なことじゃないですか!Imports ステートメントが書かれてなかったら毎回 System.・・・ って書くか、自分でImports ステートメントを書かなければいけないんですよ?NameSpace も毎回書かせるんですか!?いやいや、
Visual Basic がそんなことさせるわけないぢゃん!
試しに一番最初のコードを以下のように書き加えてみると・・・
Public Class Form1
Public Sub New()
MessageBox.Show("このメッセージは、100%リサイクルされた電子で転送されています。")
End Sub
End Class
・・・エラーになりませんね。MessageBox クラスは System.Windows.Forms 名前空間にあります。本来なら
System.Windows.Forms.MessageBox.Show("このメッセージは、100%リサイクルされた電子で転送されています。")
って書かなければいけないはずですよね?疑うべきは・・・
またコンパイラがいろいろやってくれてんな・・・。
というわけで、Visual Basic コンパイラ のオプション一覧からそれっぽいの探してきました。
MSDN:/imports (Visual Basic) (http://msdn2.microsoft.com/ja-jp/library/64c84czf(VS.80).aspx)
MSDN:/rootnamespace(http://msdn2.microsoft.com/ja-jp/library/58kxttdx(VS.80).aspx)
なるほど、コンパイル時に解決してくれるんですね。でもおかしいですよ?コンパイラはどの名前空間をImports してなにを RootNameSpace にするかは、知らないはずです。どうなっているんでしょう?
ぢつはこれは Visual Studio の仕業(?)です。先ほどのWindowsApplication1 というプロジェクトの プロパティを見てみましょう。
Imports のほうは、[参照]タブの「インポートされた名前空間」というリストがコレです。ここでチェックボックスでチェックした項目が /imports オプションに指定されるんですね。試しにリストの中の「System.Windows.Forms」のチェックをはずしてみてください。先ほどの
MessageBox.Show(・・・) はコンパイルエラーになります。
NameSpace のほうはすぐに分かります。[アプリケーション]タブの「ルート名前空間」という項目がコレです。ここに指定した内容が /rootnamespace オプションに指定されるんですね。
といった感じで、Visual Basic はそのすべてをコード上で見せてくれないんです。知りたがりな私にはちょっぴり寂しい。
Visual Basic コンパイラって、知れば知るほど「ケッ、部屋を片付けるおかんじゃねーんだから勝手にやるなよ(©ぽぴ王子さん)」ですねぇ。
C♯で自動的にコードファイルに挿入される using ステートメント ってどこで制御できるんだろ・・・?