連載

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

Chapter 08 クラス・ライブラリ

株式会社ピーデー 川俣 晶
2004/05/27
Page1 Page2 Page3 Page4


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

 再利用できるプログラムを、ライブラリという形で整理しておくことは有意義である。VB 6では、モジュールやCOMオブジェクトという形で、容易に再利用できるソース・コードを記述することができたが、VB.NETでは、クラス・ライブラリという形でライブラリを容易に構築することができる。また、.NET Frameworkには膨大な機能を含むクラス・ライブラリが標準で用意されており、これを活用することもできる。開発効率を大きく左右する機能なので、クラス・ライブラリとはどのようなものなのか、ぜひ学んでおこう。

なぜクラス・ライブラリなのか

 初期のBASIC言語には、ライブラリという概念はなかった。単純に、言語に組み込まれた機能を用いて、プログラムを作成するだけのものであった。しかし、汎用性のあるプログラムの断片を効率よく再利用したいというニーズから、徐々に、ソース・コードをライブラリ的に利用するための機能が付け加えられてきた。例えば、VB 6のモジュール機能はその一例といえる。モジュールとして記述されたコードは、容易にほかのプロジェクトに取り込んで利用できる。COMオブジェクトも、汎用的なプログラムの一部を再利用するのに都合のよい機能であった。また、Visual Basic用の汎用ライブラリのようなソフトウェア製品も販売されるようになった。

 しかし、VB 6では、主要な機能は言語仕様の一部として組み込まれていたり、専用のCOMオブジェクトとして提供されていたりすることが多く、ライブラリは限定的にしか成熟/成長してこなかったといえる。ところが、VB.NETでは、特定のプログラム言語専用ではない汎用のクラス・ライブラリが標準で提供されることで、状況が大きく変化した。もはや、VB専用の小さく居心地のよい、しかし猥雑でほかのプログラム言語のプログラマーからは見通しにくい世界に安住することはできなくなってしまったのである。

 プログラム言語を限定しないクラス・ライブラリには、どんな長所があるのだろうか。その答えは簡単だ。VB 6の時代、ライブラリといえば、VB用、C用、Java用など、プログラム言語ごとに別個のライブラリを整備する必要があった。その結果、同じような機能をプログラム言語ごとに記述する必要があり、効率が悪かった。COMオブジェクトのような言語に依存しないライブラリの作り方もあったが、COMオブジェクトはVBからの利用は容易であるものの、ほかの言語から利用する場合はVBに比べて手間が多く、COMオブジェクト以外の方法が選択されることも珍しくなかった。しかし、本当の意味でプログラム言語を限定しないクラス・ライブラリということになれば、1個の機能は1回コーディングすれば終わりである。実際、VB 6から標準で呼び出せるオブジェクトの種類と、.NET Frameworkが標準で持つクラスの種類を比較すれば、後者の方が大幅に増えていることが分かるだろう。もちろん、標準提供以外のクラス・ライブラリの種類も、プログラム言語を限定しない方が、はるかに多くのものを利用可能になることはいうまでもない。

クラス・ライブラリを使ってみる

 VBでは、&演算子で文字列を連結することができる。例えば「"A" & "B"」はABになる。とても分かりやすい機能だが、&演算子は内部的にはメモリの確保と解放を繰り返し発生させる可能性があるため、処理は速くはない。例えば、固定長の配列に文字列を入れて操作するC言語などに比べると、文字列処理の速度は見劣りしてしまうかもしれない。

 このような問題に対処するために、クラス・ライブラリには、System.Text.StringBuilderというクラスが用意されている。これは、複数の文字列を合成して新しい文字列を生成する処理を高速に行う機能を持っている。

 この2つの方法で、どれほどの速度差があるのか、実際のプログラムで検証してみよう。

 1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 2:   Dim i As Integer
 3:   Const limit As Integer = 100000
 4:   Dim from1, to1, from2, to2 As Date
 5:   from1 = Date.Now
 6:   Dim s As String
 7:   For i = 1 To limit
 8:     s = s & "A"
 9:   Next
10:   to1 = Date.Now
11:   Dim sb As New System.Text.StringBuilder()
12:   from2 = Date.Now
13:   For i = 1 To limit
14:     sb.Append("A")
15:   Next
16:   to2 = Date.Now
17:   If s = sb.ToString() Then
18:     Trace.WriteLine("同じ値")
19:   End If
20:   Trace.WriteLine((to1.Subtract(from1)).ToString())
21:   Trace.WriteLine((to2.Subtract(from2)).ToString())
22: End Sub
リスト8-1 String型文字列とStringBuilder型文字列との処理速度を検証するプログラム

 これを実行すると以下のようになる。

1: 同じ値
2: 00:00:25.8089127
3: 00:00:00.0200302
リスト8-2 リスト8-1の実行結果

 実行結果から説明すると、1行目の「同じ値」という文字列は、確かに同じ結果が得られた場合に出力するようにコーディングされたものである。2行目は、&演算子を使用した場合の処理時間。3行目は、System.Text.StringBuilderクラスを用いた場合の処理時間である。見て分かるとおり、&演算子を用いた場合は約26秒を要しているのに対して、System.Text.StringBuilderクラスを用いた場合は、1秒もかかっていないということである。圧倒的な速度差といえる。なお、この数値は筆者のパソコン上の値で、異なる環境では違う値になるのでご注意いただきたい。

 このような差があることを考えれば、文字列処理が遅すぎる個所に限ってでも、このようなクラス・ライブラリを活用する価値があるといえるだろう。この例は、速度差がメリットになる場合だが、機能がメリットになる場合もある(例えば、エンコーディング名を指定したテキスト・ファイルの入出力など。詳しくは、エンコーディング名を指定したテキスト・ファイルの入出力を参照)。

 プログラムについても解説しておこう。3行目は、繰り返す回数として、100,000回という値を変数に定義している。この回数だけ、1文字を追加するという作業を繰り返して、時間を計測する。4行目は、2つのケースの開始時刻と終了時刻を保存する変数を宣言している。5〜10行目は、&演算子を使った場合。11〜16行目は、System.Text.StringBuilderクラスを使った場合である。14行目のAppendメソッドは、引数の文字列を、インスタンスが内部に保持する文字列に追加する機能を持つ。なお、同じ文字を繰り返すだけなら、VBのString関数を使うという手もあるが、実際のプログラミングで、同じ文字だけを繰り返し追加するという場面はそう多くないので、比較の対象には入れていない。あくまで、同じ文字を追加しているのは速度を見るためであって、本来はさまざまな文字が追加されることを前提としている。

 VB.NETに慣れていないVBプログラマーなら、20〜21行目は戸惑うかもしれない。ここではDate型の変数にSubtractメソッドを使っているが、これはエラーにはならない。Date型は、実はクラス・ライブラリのSystem.DateTime構造体の別名であって、このクラスのメソッドを呼び出せる。つまり、2つの日付時刻の差分を得るSubtractメソッドがSystem.DateTime構造体に存在するので、これを呼び出すことができる。差分は、System.TimeSpanクラスのインスタンスとして返されるが、ここでは、それに対してToString()メソッドを呼び出して文字列に直して出力している。これらの行も、クラス・ライブラリの恩恵を受けて機能しているのである(構造体など、クラス以外のものもクラス・ライブラリに含まれる)。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 08 クラス・ライブラリ
  1.なぜクラス・ライブラリなのか/クラス・ライブラリを使ってみる
    2.名前空間とアセンブリの関係/Importsステートメントによる短縮表記
    3.Importsステートメントを記述せずに参照できる名前空間/ソリューションエクスプローラに表示される参照設定の意味
    4.クラス・ライブラリに含まれるさまざまな名前空間
 
「改訂版 プロフェッショナル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