連載

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

第27回 言語の動作を選択するオプション(後編)

(株)ピーデー
川俣 晶
2002/11/30

Page1 Page2 Page3

■宣言でのAs句の省略

 Dim文やメソッドの引数などでは、Asキーワードを使って型を指定する。この型指定は省略可能であり、省略するとVB 6ならVariant型、VB.NETならObject型と見なされる。以下は、そのような機能を利用した例である。

  1: Public Class Form1
  2:   Inherits System.Windows.Forms.Form
  3:
  4: …Windows フォーム デザイナで生成されたコード…
  5:
  6:   Private Sub Sample(ByVal a)
  7:     Dim b
  8:     b = 2
  9:     Trace.WriteLine(a + b)
 10:   End Sub
 11:
 12:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 13:     Sample(1)
 14:   End Sub
 15: End Class
Asキーワードにより型指定を省略して変数宣言しているサンプル・プログラム12

 見てのとおり、6行目や、7行目で、Asキーワードを使わない変数や引数を宣言している。このソースの先頭にOption Strict Onを書き込むと、以下のようなビルド・エラーが発生するようになる。

Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(47) : error BC30209: Option Strict On では、すべての変数宣言に 'As' 句が必要です。 Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(48) : error BC30209: Option Strict On では、すべての変数宣言に 'As' 句が必要です。 Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(50) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。 Q:\aWrite\@it\vbn\022\smpl\Sample008n2\Form1.vb(50) : error BC30038: Option Strict On では、演算子 '+' に対して Object 型のオペランドを使用することはできません。
サンプル・プログラム12の先頭に、Option Strict Onを書き込んだ場合に発生するビルド・エラー

 エラーが起きる原因は、Option Strict OnのときにはAs句を省略できないという制約による。そこで、変数や引数にAs Integerのような記述を補ってやると正常にビルド可能になる。

  1: Option Strict On
  2:
  3: Public Class Form1
  4:   Inherits System.Windows.Forms.Form
  5:
  6: …Windows フォーム デザイナで生成されたコード…
  7:
  8:   Private Sub Sample(ByVal a As Integer)
  9:     Dim b As Integer
 10:     b = 2
 11:     Trace.WriteLine(a + b)
 12:   End Sub
 13:
 14:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 15:     Sample(1)
 16:   End Sub
 17: End Class
サンプル・プログラム12を、As句により型指定するように書き換えたサンプル・プログラム13

 このソースは問題なくビルドでき、実行できる。As句を補うときに、As Objectを無条件で補えば、データ型の違いを意識せずに対応できるが、これはお勧めしない。本当に必要とされているデータ型をAs Integerのように明示的に指定すると、意図しない誤ったデータの扱いがあれば、ビルド時にコンパイラが教えてくれる。コンパイラが教えてくれれば、バグ取りに要する時間や手間は軽減されるだろう。

Option Compare

 Option Compare文は、文字列の比較方法を指定する。指定できる値は、「Text」と「Binary」で、プロジェクト作成時のデフォルトはBinaryである。この2つは、それぞれ、Textが普通に使われる文字順、Binaryが文字コード番号順という役割を持つ。

 まず、Option Compare文を指定しない場合、つまりデフォルトのOption Compare Binaryの状態で、以下のサンプル・プログラムを試してみよう。

 1: Public Class Form1
 2:   Inherits System.Windows.Forms.Form
 3:
 4: …Windows フォーム デザイナで生成されたコード…
 5:
 6:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 7:     Trace.WriteLine("B" > "a")
 8:   End Sub
 9: End Class
Option Compare Binaryの状態(デフォルト)で文字列を比較するサンプル・プログラム14

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

 1: False
サンプル・プログラム14の実行結果

 これは、「『"B" > "a"』は偽である」、つまり、「"B"は"a"以下である」ことを示している。文字コードで見れば、「B」は66で、「a」は97であるから、文字コード順ではそのとおりである。

 では、このソースの先頭に、Option Compare Textと書き込んで、普通に使われる文字順に切り替えるとどうなるだろうか?

  1: Option Compare Text
  2:
  3: Public Class Form1
  4:   Inherits System.Windows.Forms.Form
  5:
  6: …Windows フォーム デザイナで生成されたコード…
  7:
  8:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9:     Trace.WriteLine("B" > "a")
 10:   End Sub
 11: End Class
サンプル・プログラム14にOption Compare Textを指定したサンプル・プログラム15

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

 1: True
サンプル・プログラム15の実行結果

 これは、「『"B" > "a"』は真である」、つまり、「"B"は"a"より大きい」ことを示している。確かに、辞書などでは、通常、大文字のBで始まる単語は、小文字のaで始まる単語より後に配置するので、正しく判断されていることが分かる。

 ここで注意すべきことは、普通に使われる文字順(Option Compare Text)は、システムのロケール(言語や国に固有の情報)の指定の影響を受けるということである。つまり、日本のロケールで動いている場合と、中国や韓国のロケールで動いているときに、異なる基準で比較判断される可能性があるということである。そのため、Option Compare Textを使用するときには、使用される可能性のあるどのロケールでも適切に動作するように慎重にプログラムを作成しなければならない。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第27回 言語の動作を選択するオプション(後編)
    1.遅延バインディング
  2.宣言でのAs句の省略
    3.整数のオーバーフロー・チェック
 
「プロフェッショナル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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間