特集Visual Basic 2005へ移行する理由(中編)VB6開発者にやさしいVB2005の言語仕様om (takanao)(Microsoft MVP Oct 2005 - Oct 2006 Visual C#)2006/01/07 |
|
|
■3.7 デフォルト・プロパティ
デフォルト・プロパティは、暗黙の型変換と並んでVB6の特徴的な機能である。例えば、以下のようなコードを実行すると、テキストボックスには“abc”という文字が表示される。
|
|
VB6でデフォルト・プロパティを使用した例 | |
Textプロパティを指定しなくてもTextプロパティに文字列が渡される。 |
これはVBにオブジェクトという考えがなかったときからの仕様である。しかし、VBのバージョンが上がってオブジェクトという概念が導入され、その際に、オブジェクトの代入なのか値の代入なのかを区別するためのSetというステートメントが追加された。
例えば、以下のようなコードを実行することによって、text1という変数にtext2のインスタンスを代入することができた。
|
|
VB6でオブジェクトを代入する例 | |
text1にtext2のインスタンスが代入される。 |
だが、オブジェクトの代入をするつもりで、以下のようにSetステートメントの記述を忘れてもコンパイル・エラーになることはない。
|
|
VB6でデフォルト・プロパティを使用した例 | |
オブジェクトの代入をしようとして、Setステートメントの記述を忘れた例 |
このようなコードを記述した場合も、プログラムは一見正しいような動作をする。だが実際は、オブジェクトは代入されず、text2のデフォルト・プロパティであるTextプロパティの値がtext1のTextプロパティに代入されるだけである。
このように、コンパイル時にも実行時にもエラーは発生しないが、開発者が意図していない動作をしてしまうバグを回避するために、VB.NETではデフォルト・プロパティと変数にオブジェクトを代入するためのSetステートメントがなくなった。プロパティを省略したときは、オブジェクトの参照を代入をするように変更したのである(ただし、例外的に引数付きのデフォルト・プロパティは作成可能である)。
この仕様はVB2005でも同様である。テキストボックスに文字列を代入する場合でも、「TextBox1 = "abc"」と記述するとコンパイル・エラーになる。デフォルト・プロパティの記述に慣れた開発者は面倒に思うかもしれないが、見つけにくいバグを回避するために厳密な指定を強要する仕様になっている。
■3.8 オブジェクトの解放
本Insider.NETフォーラムの読者なら、「.NET Frameworkには、ガーベジ・コレクションが用意されているので、プログラマはメモリ管理から解放される」という説明を読んだことがある方も多いだろう。
ところが、VB6でもほとんどの場合はメモリ管理を気にする必要はなかった。唯一、解放を意識する必要があったのがCOMオブジェクトであった。COMオブジェクトの場合は、不要になった時点でそれを参照している変数に、明示的にNothingをセットすることで解放されていた。VB.NETでは、このNothingの代入も不要になっていて、適当なタイミングでガーベジ・コレクションが実行されて、不要になったオブジェクトを解放するようになった。
一見便利に思えるガーベジ・コレクションだが、VB6開発者から見ると不便になった点もあった。IDisposableというインターフェイスを実装したクラスの場合、不要になった時点でDisposeというメソッドを呼び出さなくてはならないという決まりがあったことだ。このようなクラスは基本的に、データベースへの接続やWindowsが内部的に使用しているリソースなど、いつ実行されるか分からないガーベジ・コレクションを待たずに、不要になったらすぐに解放した方がよい有限のリソースを内包している。
だがDisposeメソッドの呼び出しは、コーディングを行っていると忘れてしまいがちな部分でもあった。これを忘れることによって、直接的に不具合が発生することはないが、アプリケーションを使い続けているうちに突然データベースにつながらなくなることや、メモリの使用率は高くないのにメモリ不足というエラーが発生すること(=システム・リソース不足)があった。
これを回避するためにVB2005では、Using〜End Usingというステートメントが用意された。以下の例のように、Usingキーワードを使って変数を初期化すると、End Usingの時点で自動的にDisposeメソッドが呼び出される。
|
|
Usingブロックでクラスを使用した例 | |
Usingで変数を初期化すると、End Usingで自動的にDisposeメソッドが呼び出される。 |
では、コーディングについてはここまでにして、次にデバッグ機能の進化に話を進めよう。
■3.9 エディット&コンティニュー
VB6開発者が従来のVB.NETを使うと最も不満を漏らすのが、「エディット&コンティニュー機能」がないことだろう。VB6はデバッグ機能が充実していて、デバッグ時にコードを編集しても、リコンパイルすることなくデバッグ処理を継続することができた。この機能はエディット&コンティニューと呼ばれている。
エディット&コンティニューはBASIC言語がインタープリタで実行されていたころから実現できた機能である。インタープリタとは、「プログラムをネイティブ・コードへコンパイルする」という手順を踏まずに、プログラム・コードをそのまま逐次解釈しながら実行する言語処理のことだ。VBではバージョン5.0のときにコンパイル型言語としても利用できるようになったが、依然としてインタープリタ型言語の機能も残していたため、VB6でもエディット&コンティニューが従来どおり実現されていた。
しかしVB.NETになると、完全なコンパイル言語となったため、この機能が削られてしまった。VB6開発者の多くは、この機能を使って効率よくプログラムをデバッグするのに慣れていたので、その開発スタイルが大きく変わってしまうVB.NETに移行するのに抵抗が強かった。そのためこれが、.NETへ移行するときの障壁の1つとなっていたのだ。
しかしVB2005では再びエディット&コンティニュー機能が復活することになった。それだけでなく、デバッグ実行時にプロパティや変数の値を変更するためのユーザー・インターフェイス(UI)がVB6よりも分かりやすくなっており、使い勝手が明らかに向上している。
以下の画面は、VB6とVB2005のそれぞれのIDEでプロパティの値を変更する際の違いを示したものだ。
VB6での値の変更例 |
VB6では[イミディエイト]ウィンドウより値を変更できたが、このウィンドウは実際のエディタ上の表示とは分離されていたため、分かりにくかった。 |
VB2005での値の変更例 |
VB2005では変数の上にカーソルを乗せるとツールチップで変数の値が表示される。さらに、変数の値にカーソルを持っていき、そのまま値を編集することができる。 |
このようにVB2005ではより直感的にエディット&コンティニューが実現できるようになっている。
■
以上、今回はVB2005における言語仕様やクラス・ライブラリなどのコーディング面の進化と、エディット&コンティニューというデバッグ面の進化について解説した。最終回である次回は、新しくなったデータ・アクセス機能や、強化されたデプロイメント機能、VB6開発者にとっては最も気になる移行ウィザードの進化について説明する。お楽しみに。
INDEX | ||
[特集]Visual Basic 2005へ移行する理由 | ||
VB2005は.NETへの移行を加速できるのか!? | ||
1.なぜVB6開発者はVB.NETに移行しなかったか? | ||
2.互換性が高まった開発環境 | ||
VB6開発者にやさしいVB2005の言語仕様 | ||
1.フォームのデザインと生成されるコード、フォームのインスタンス化処理 | ||
2.Myオブジェクト、コード・スニペット、配列の下限指定、暗黙の型変換 | ||
3.デフォルト・プロパティ、オブジェクトの解放、エディット&コンティニュー | ||
VB6開発者が待ち望んだVB2005の便利機能 | ||
1. 進化したデータ・アクセス機能とアプリケーションの配布技術 | ||
2. 完成度を高めた移行ウィザードとまとめ | ||
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -