連載

改訂版
プロフェッショナルVB.NETプログラミング

Introduction:Visual Basic .NETへの飛躍

株式会社ピーデー 川俣 晶
2004/01/28
Page1 Page2 Page3

 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 .NET Frameworkより得るもの

 .NET Frameworkは、Visual Basic以外の多くの言語も扱うことを前提としている。そのため、従来のVisual Basicには存在しない機能も多数含んでいる。しかし、それらの機能は特定言語専用という構造ではないため、VB.NETから利用することもできる。つまり、.NET Frameworkという環境の上にVisual Basicが引っ越した結果、さまざまな新しい機能がVB.NETからも手の届く範囲にやってきたというわけである。例えば、On Error GoTo文よりも強力なエラー処理を実現する、例外という機能がVB.NETでは利用できる。例外はもともとC++やJavaなどで使われてきた機能だが、.NET Frameworkでは標準的にエラー処理を行う方法として取り入れられている。そこで、当然の成り行きとしてVB.NETでも例外がサポートされているわけである。

 もう1つ、VB.NETで利用可能になるのは、.NET Framework標準の膨大なクラス・ライブラリである。このクラス・ライブラリには、さまざまな機能を持った便利なクラスが用意されており、これらを自由に呼び出して利用することができる。その中には、過去のVisual Basicが標準で持つ機能と重複するものもある。例えばVB 6では、ファイルを開いて読み出すといった機能が言語に組み込まれていたが、.NET Frameworkのクラス・ライブラリにもファイルを開いて読み出す機能が用意されている。しかし、両者の持つ機能は同等というわけではなく、クラス・ライブラリの方がより現在のニーズにマッチした高度な機能を備えている。例えばファイルを開く機能でいえば、クラス・ライブラリでは開くファイルの文字コード・エンコーディングを指定する機能があり、シフトJIS以外で記述されたテキスト・ファイルも容易に扱うことができる(その実例は、このあと紹介する)。

 もう1点、大きな特徴がある。.NET Frameworkの世界では、クラスやメソッドは、プログラム言語ではなく.NET Framework側で取り扱いの規定がなされている。.NET Framework上のプログラム言語は基本的にその規定に沿っているため、VB.NETから、他言語で書かれたクラスやメソッドを呼び出すことは極めて容易である。何もしなくてもただ呼び出せばよい。逆も真で、VB.NETで記述したクラスやメソッドは他言語から容易に呼び出すことができる。VB 6でも、COMオブジェクトの形にすれば、言語を超えた呼び出しが可能になるが、VB.NETではその手間すら必要ない。これにより、言語の枠を超えたコードの融通がいままで以上に進むのではないかと思われる。例えば、社内のほかの部署で書かれた他言語のプログラムを取り込んで使うのも簡単になる。また、市販のライブラリ類にしても、いままではVisual Basic用、C++用……と分かれていたが、.NET Framework上で動作するものは.NET Framework用という1種類しか存在しないことになる。そのため、利用可能なライブラリのバリエーションが増えるかもしれない。

 それでは具体的なソース・コードを見ながら、新しい機能を使うことのメリットを見てみよう。サンプルとしては、テキスト・ファイルの読み出しを取り上げる。文字コードとしてUnicode(UTF-16)で記述されたテキスト・ファイルがあり、それを読み出すプログラムをVB 6とVB.NETの双方で書いてみよう。まずはVB 6から(リスト0-15)。

 1: Private Sub Form_Load()
 2:   Const ForReading = 1
 3:   Const TristateTrue = -1
 4:   Dim fs, f
 5:   Set fs = CreateObject("Scripting.FileSystemObject")
 6:   Set f = fs.OpenTextFile("c:\testfile.txt", ForReading, False, TristateTrue)
 7:   Do While f.AtEndOfStream <> True
 8:     s = f.ReadLine
 9:     Debug.Print s
10:   Loop
11:   f.Close
12: End Sub
リスト0-15 テキストファイルを読み込み表示するプログラム

 VB 6におけるファイルを開くための最も基本的な機能は、Openステートメントであるが、日本語環境で普通に使えばシフトJISファイルを読み込むことになり、Unicodeファイルを読み出すことはできない。そこで、FileSystemオブジェクトを使用している。OpenTextFileメソッドの第4引数をTristateTrueに設定すれば、Unicodeテキスト・ファイルを正しく読み出してくれる。

 次にVB.NETを使って、生の.NET Frameworkのクラス・ライブラリを呼び出して記述した例を示す(リスト0-16)。

 1: Imports System.IO
 2:
 3: Public Class Form1
 4:   Inherits System.Windows.Forms.Form
 5:
 6: #Region " Windows Form Designer generated code "
 7:
 8:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 9:     Dim reader As StreamReader
10:     reader = New StreamReader( _
11:       New FileStream("c:\testfile.txt", FileMode.Open, FileAccess.Read), _
12:       System.Text.Encoding.GetEncoding("UTF-16"))
13:     Do
14:       Dim s As String
15:       s = reader.ReadLine()
16:       If s = Nothing Then Exit Do
17:       Debug.WriteLine(s)
18:     Loop
19:     reader.Close()
20:   End Sub
21: End Class
リスト0-16 テキストファイルを読み込み表示するプログラム

 なお、6行目の部分は、統合環境が自動生成したコードが隠されていることを示す。さて、2つを見比べれば、まったく異質のソースであることが分かるだろう。クラス・ライブラリは、Visual Basicプログラマーに分かりやすいことを意図して設計されているわけではないのである。これらのプログラミングの詳細は、今後本連載で解説する。とはいえ、この章を読むにはソースの内容を具体的に理解できなくても構わない。

 しかし、1カ所だけ理解していただきたいところがある。それは12行目の“UTF-16”という指定である。これが、読み出すファイルがシフトJISではなく、Unicode(UTF-16)で記述されたテキスト・ファイルであることを示している。VB 6の例では、Unicodeかどうかをフラグ値で設定していたが、クラス・ライブラリでは名前で与えることができる。つまり、シフトJISとUnicodeだけでなく、ほかの多くの種類の文字エンコーディングで記述されたファイルを、容易に指定して読み書きできることを示している。例えば、UNIXサーバから転送されてきたファイルはEUC-JPで記述されているので、そのままでは読み込めない、といった問題を解決するのは極めて容易になる。

 もう1つ例を見てみよう。VB.NETで書いたクラス・ライブラリと、C#で書いたクラス・ライブラリが同じように扱えることをサンプル・ソースを通して見てみよう。なお、このサンプル・ソースの詳細は理解できなくても構わない。

 まず、指定座標に赤色でHelloと出力するメソッドを持つクラス・ライブラリを作成してみよう。新規プロジェクト作成で、Visual Basicのクラス・ライブラリを選んでプロジェクトを作り、以下のようなソースを書き込む。

 1: Imports System.Drawing
 2:
 3: Namespace VBSample
 4:   Public Class Sample001
 5:     Public Sub DrawRedHello(ByRef g As Graphics, ByVal x As Integer, ByVal y As Integer)
 6:       g.DrawString("Hello!", New Font(FontFamily.GenericSansSerif, 12), _
 7:         Brushes.Red, x, y)
 8:     End Sub
 9:   End Class
10: End Namespace
リスト0-17 VB.NETで記述した、文字列を出力するクラスライブラリ

 見慣れないDrawStringというメソッドを呼び出しているが、これは文字を描くための.NET Frameworkの機能である。なお、テンプレートとしてクラス・ライブラリを選んだプロジェクトは、グラフィック関係のアセンブリ(.NET Frameworkでは、実行ファイルやDLLファイルなどをアセンブリと呼ぶ)、System.Drawing.DLLを標準では参照していないので、参照を追加しておく必要がある。

 さて、これと同じものをC#でも記述してみよう。これは、まあこんなものだと思って軽く見ていただければよいだろう。機能的にはVB.NET版とほとんど同じである。ワークスペースにC#のクラス・ライブラリを新規プロジェクトとして追加し、以下のようなソースを入力する。

 1: using System;
 2: using System.Drawing;
 3:
 4: namespace CSClassLib
 5: {
 6:   public class Sample002
 7:   {
 8:     public void DrawRedHello(Graphics g, int x, int y)
 9:     {
10:       g.DrawString("Hello!", new Font(FontFamily.GenericSansSerif, 12),
11:         Brushes.Red, x, y);
12:     }
13:   }
14: }
リスト0-18 C#で記述した、文字列を出力するクラスライブラリ

 さて、これを同じように呼び出して使用できることを示すために、呼び出し側のプログラムを作成してみよう。ワークスペースにVisual BasicのWindowsアプリケーションの新規プロジェクトを追加する。

 まずは、同じワークスペース内の2つのクラス・ライブラリを参照に追加する。そして、図0-19のようにフォームに2個のピクチャーボックスを貼り付ける(ここでは見やすいように背景色を変更し、枠線を付けてある)。

●図0-19 2個のピクチャーボックスを貼り付けたフォーム

 そして以下のようなソースを書き込む。

 1: Public Class Form1
 2:   Inherits System.Windows.Forms.Form
 3:
 4: #Region " Windows Form Designer generated code "
 5:
 6:   Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
 7:     Dim sample001 As VBClassLib.VBSample.Sample001
 8:     sample001 = New VBClassLib.VBSample.Sample001()
 9:     sample001.DrawRedHello(e.Graphics, 0, 0)
10:   End Sub
11:
12:   Private Sub PictureBox2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint
13:     Dim sample002 As CSClassLib.Sample002
14:     sample002 = New CSClassLib.Sample002()
15:     sample002.DrawRedHello(e.Graphics, 0, 0)
16:   End Sub
17: End Class
リスト0-20 VB.NETとC#で記述したクラスライブラリを呼び出すプログラム

 4行目の部分は、統合環境が自動生成したコードが隠されていることを示す。

 これで、上のピクチャーボックスにはVB.NET版のクラス・ライブラリの処理結果が表示され、下のピクチャーボックスにはC#版のクラス・ライブラリの処理結果が表示される。結果は以下のようになる。

●図0-21 リスト0-20の実行結果

 見てのとおり結果は同じになるが、それは同じクラス・ライブラリのメソッドを呼び出しているからで、当たり前である。それよりも注目していただきたいのは、VB.NETとC#のどちらのクラス・ライブラリのメソッドを呼び出す場合でも、宣言や手順にほとんど差がないことである。このように、複数言語の混在は、VB.NETでは非常にハードルが低くなっている。

 以上のように、VB.NETでは、VB 6では扱えなかった機能を扱えるよう、さまざまな可能性が切り開かれているのである。そして、それを実現するために、プログラムの書き方そのものが大きく変化しているのである。この変化を乗り越えて、よりパワフルなプログラムを作成することが、VB 6からVB.NETに乗り換える醍醐味といえるだろう。End of Article


VB6プログラマーのための入門 Visual Basic .NET 独習講座』

 本記事は、(株)技術評論社が発行する書籍『VB6 プログラマーのための 入門 Visual Basic .NET 独習講座』から
許可を得て転載したものです。

【本連載と書籍の関係について 】
 この書籍は、本フォーラムで連載した「連載 プロフェッショナルVB.NETプログラミング」を大幅に加筆修正し、発行されたものです。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。

技術評論社の解説ページ

ご注文はこちらから
   

 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Introduction:Visual Basic .NETへの飛躍
    1.大きな変化を伴うバージョンアップ
    2.開発環境の比較、言語仕様の変化、実行環境の変化
  3..NET Frameworkより得るもの
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


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