特集

Visual Basic 2005へ移行する理由(中編)

VB6開発者にやさしいVB2005の言語仕様

om (takanao)(Microsoft MVP Oct 2005 - Oct 2006 Visual C#)
2006/01/07

Page1 Page2 Page3

■3.3 Myオブジェクト

 VB6から比べると、VB.NETでは.NET Frameworkが提供するクラス・ライブラリによって利用できる機能が大幅に増加した。そして、大幅に増加した機能を整理するため、クラスを階層により管理するようになった。きれいに階層化されて一見便利に見えたが、VB6で簡単に扱えていた機能(例えば、ClipboardオブジェクトやAppオブジェクトなど)まで階層化されてしまったため、VB6開発者の多くはこれまで簡単に使えていた必要な機能を見つけるのが困難になってしまった。このような変更が、VB6開発者の移行を困難にしていた。

 VB2005では、頻繁に使用する機能が“My”というオブジェクトに集まっているので、そういった機能に簡単にアクセスできるようになった。VB6のアクセス方法とは違うものの、必要な機能をすぐに見つけられないという問題が解決することが期待されている。

 実際に、VB6で簡単にアクセスできていた機能の多くが、Myオブジェクトから簡単にアクセスできるようになっている。例えば、クリップボード(Clipboard)に文字列をセットするには、次のようなコードでアクセスできる。

System.Windows.Forms.Clipboard.SetText(“Text”)
My.Computer.Clipboard.SetText(“Text”)
Myオブジェクトの使用例
上の記述が.NET Frameworkの機能によってクリップボードへテキストをセットしているコードで、下がMyオブジェクトを使用してクリップボードにテキストをセットしているコードだ。

 このように、.NET Frameworkのクラス・ライブラリが機能別に整理されているのに対して、Myオブジェクトは、開発者を含めたユーザーにとって、より直感的な分類で整理されている。

 My機能の詳細については「“My”はクラスの海からVBプログラマを救う!?」ですでに紹介しているので、そちらをご覧いただきたい。

■3.4 コード・スニペット

 Myオブジェクトを使用することで、頻繁に使用する機能を簡単に呼び出せることは理解していただけたと思う。しかし、これだけでアプリケーションが作れるわけではない。相変わらず、.NET Frameworkには大量のクラスが用意されていて、これらを使いこなさなくては実現できない機能がたくさんある。例えば、テキスト・ファイルを読み込むという処理は頻繁に記述するだろうが、実はMyオブジェクトにはそのような機能が用意されていない。こんなときに役に立つのがコード・スニペットだ。

 コード・スニペットを実際に使った手順を見てみよう。

コード・エディタ上で右クリックするとコンテキスト・メニューが表示される。ここで[スニペットの挿入]をクリックする。

コード・スニペットの利用手順1([スニペットの挿入]をクリック)

コード・スニペットに登録されているカテゴリ一覧が表示されるので、挿入したいコードが含まれるカテゴリをクリックする。

コード・スニペットの利用手順2(カテゴリをクリック)

コードを挿入したい処理をクリックする。

コード・スニペットの利用手順3(処理をクリック)

コードが挿入されて、変更が必要な個所がハイライト表示される。ハイライト表示されている部分を書き換えると、必要な処理が出来上がる。

コード・スニペットの利用手順4(ハイライト表示部分を書き換え)

 見ていただいたとおり、あらかじめ用意されている項目を選択するだけで、必要なコードが自動的に作成されているのをご理解いただけたと思う。

 このようにVB2005では、巨大なクラス・ライブラリの海でおぼれないように、頻繁にアクセスすると想定される機能の多くがすでにテンプレートとして用意されている。さらに、コード・スニペットは拡張可能なため、開発プロジェクトの中で頻繁に使う機能や、自社で作成したライブラリの呼び出しなど、繰り返し使う機能をまとめておくことも可能である。

 この機能によって、複雑なクラス・ライブラリの階層を理解できずに移行をちゅうちょしていたVB6開発者がやりたい処理を簡単に実現できるようになって、スムーズに移行が進むことが期待されている。

■3.5 配列の下限指定

 VB6では、配列を宣言するときに、以下のように配列の下限(LBound)と上限(UBound)を指定できた。

Dim stringArray(5 To 10) As String
配列の下限と上限が指定できたVB6
この例では下限を「5」に、上限を「10」に指定している。

 VB.NETでは、下限が指定できなくなり、常に0から始まる宣言数(=上限)の変数要素が生成されることになった。

Dim stringArray(10) As String
Dim stringArray(5) As String
配列の下限を指定できなくなったVB.NET
この例では上限を「10」と「5」に指定しているが、下限は常に「0」になる。

 VB6開発者は、下限も指定するのが言語仕様だと理解していたため、VB.NETでの言語仕様の変更によって配列の指定方法が変更されたことに、違和感を持った人も多かった。

 VB2005では下限の指定が復活している。ただし書式が同じなだけで、下限で指定できるのは0固定のままである。

Dim stringArray(0 To 10) As String
Dim stringArray(0 To 5) As String
配列の下限に0を指定できるようになったVB2005
この例では下限を「0」に、上限を「10」や「5」に指定している。下限は「0」しか指定できない。

 これによってVB6開発者が持っていた違和感を取り除けるかどうか筆者には疑問である。下限の値を設定できないことに違和感を持ち続けるVB6開発者も多いのではないかと予想している。

■3.6 暗黙の型変換

 VB6までは、開発者が型をあまり意識しなくてもよいように設計されていた。変数の型を指定することはできたが、実行時に自動的に変換されるため、結果的に型を意識しなくてもプログラムを実行できた。例えば、以下のコードを実行すると、11と表示される。

1: Dim s As String
2: Dim n As Integer
3:
4: s = 5                 ' String型に数値を代入している。
5: n = s + 6             ' String型に数値を加算している。
6: MsgBox(n)
暗黙的に型が変更されるコードの例(VB6)

 上記のコードでは、4行目でString型の変数であるsに対して、数値(Integer)型の5を代入している。このとき、内部では5という数値を“5”という文字に変換して代入している。次に5行目で、String型のsに対して数値型である6を加算して、その結果をInteger型である変数nに代入している。このとき、内部ではsという文字列型に代入されている“5”という文字を数値の5に変換して、数値型の6と加算して、加算結果である11をInteger型であるnに代入しているのである。最後に6行目でInteger型であるnが文字列型に変換されて、メッセージボックスが表示される。

 一見便利に見える暗黙の型変換だが、思わぬバグの原因になることも多かった。上の例を少しだけ変えた以下のようなコードを書いたとする。5行目で加算している値を文字の“6”に変更しただけだ。この場合、開発者は同じようにnが11になると考えたのかもしれないが、結果としては、「56」という値が表示される。

1: Dim s As String
2: Dim n As Integer
3:
4: s = 5                 ' String型に数値を代入している。
5: n = s + "6"           ' String型に"6"という文字を加算している。
6: MsgBox(n)
加算している数値を文字に変更した例(VB6)

 この場合には、String型同士の加算であるため、両者はString型として結合される。

 ここまで説明したように、暗黙の型変換は思わぬバグの温床になる可能性があった。そのため、VB.NETの初期の開発者向けプレビュー版では暗黙の型変換を行わないように仕様変更された。上記のようなコードが書かれた場合、コンパイル時にエラーを表示して、プログラムをビルドできないようにしたのである。

 だが、暗黙の型変換に頼っている既存のコードが大量に存在していたし、そのようなコードを書くVB6開発者も多かった。そのため、VB.NETの製品版リリースまでの間に、暗黙の型変換を行うかどうかが設定可能な「Option Strict」というオプションが追加された。

 VB.NETの設計者たちは互換性を維持して暗黙の型変換を許可するか、暗黙の型変換を禁止してコードの安全性を重視するかを悩んだのだろうが、思わぬバグの温床になりかねない暗黙の型変換を禁止する「Option Strict On」をデフォルトに設定することにした。このため、暗黙の型変換ができなくなり、これまで実行できていたコードは完全に実行できなくなってしまったと誤ってとらえてしまったVB6開発者は多かったのではないだろうか。また、オプションの設定変更を見つけることができないまま、VB.NETを使うことを避けた開発者も多かっただろう。

 VB2005では、暗黙の型変換を行う「Option Strict Off」にデフォルトの設定が変更されている。

VB2005の「既定のプロジェクト設定」
Option StrictはデフォルトでOffに設定されている。

 この仕様変更によって、VB6開発者が.NETの世界に来てくれることを期待している。だが、先に書いたように、思わぬバグを生む可能性があることを理解していただいて、できることなら暗黙の型変換が行われない「Option Strict On」の設定でコードを書くことをお勧めしたい。


 INDEX
  [特集]Visual Basic 2005へ移行する理由
  VB2005は.NETへの移行を加速できるのか!?
    1.なぜVB6開発者はVB.NETに移行しなかったか?
    2.互換性が高まった開発環境
 
  VB6開発者にやさしいVB2005の言語仕様
    1.フォームのデザインと生成されるコード、フォームのインスタンス化処理
  2.Myオブジェクト、コード・スニペット、配列の下限指定、暗黙の型変換
    3.デフォルト・プロパティ、オブジェクトの解放、エディット&コンティニュー
   
  VB6開発者が待ち望んだVB2005の便利機能
    1. 進化したデータ・アクセス機能とアプリケーションの配布技術
    2. 完成度を高めた移行ウィザードとまとめ
 


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH