連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第3回 構造体の宣言とその効能

(株)ピーデー
川俣 晶
2002/04/16

Page1 Page2 Page3

行番号使用時のコロン(:)記号 

 まずは肩慣らしとして、VB.NET(Visual Basic .NET)とVB 6(Visual Basic 6.0)の簡単な相違から取り上げてみよう。本連載の第1回でもちらりと取り上げたが、伝統的なBASIC言語といえば、行番号が付きものである。いまさら使う人はいないかもしれないが、場合によっては旧世代のソースを資産として使っている場合もあり得るので、簡単に触れておく。

 VB 6では、行番号の後に空白文字を入れて、そのままステートメントを記述することが可能だった。また、行番号とは一種のラベルなので、ラベルと同じように番号の後ろにコロン(:)記号を書いてもよい。もちろん、番号ではなくラベルとして名前を書き、その後にコロン記号を書くことも許される。これを示したのが以下のサンプル・ソースだ。

1: Private Sub Form_Load()
2:    GoTo 10
3: 10 Debug.Print "Hello1"
4:    GoTo 20
5: 20: Debug.Print "Hello2"
6:    GoTo label
7: label: Debug.Print "Hello3"
8: End Sub
行番号(コロン(:)記号あり/なし)とラベルを使用したVB 6のサンプル・プログラム1
注意:左端にある1:〜8:までの行数表示は、掲載の都合で編集部が挿入したもの。

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

Hello1
Hello2
Hello3
サンプル・プログラム1の実行結果

 これに対しVB.NETでは、行番号の後にコロン記号を置かずに、そのまま継続してステートメントを書く構文は許されない。そのため、行番号の後ろには必ずコロン記号を書かねばならない。上記のサンプル・ソースをVB.NETで書き直したものが下記のサンプル・ソースである。

1:     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2:       GoTo 10
3: 10:   Trace.WriteLine("Hello1")
4:       GoTo 20
5: 20:   Trace.WriteLine("Hello2")
6:       GoTo label
7: label:  Trace.WriteLine("Hello3")
8:     End Sub
行番号の後には必ずコロン(:)記号が必要になるVB.NETのサンプル・プログラム2

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

Hello1
Hello2
Hello3
サンプル・プログラム2の実行結果

 この相違は、実用上はさほど重要ではない。なぜなら、行番号の付いたソース・コードをIDEのソース編集ウィンドウに書き込むと、IDEが勝手に行番号の後ろにコロン記号を挿入してくれるためである。

固定長文字列

 すでに述べたことだが、VB.NETでは固定長文字列がサポートされない。以下のようなVB 6ソース・コードは、そのままVB.NETでは実行できない。

1: Private Sub Form_Load()
2:   Dim s As String * 4
3:   s = "ABCDEF"
4:   Debug.Print s
5: End Sub
固定長の文字列を使用したVB 6のサンプル・プログラム3

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

ABCD
サンプル・プログラム3の実行結果

 変数sは4文字分のサイズしかないので、6文字の文字列を代入しても、実際には4文字しか保存されない。

 以下はVB.NETで、これとほぼ同等の機能を記述した一例である。

1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2:   Dim s As String
3:   s = LSet("ABCDEF", 4)
4:   Trace.WriteLine(s)
5: End Sub
サンプル・プログラム3と同等の機能を記述したVB.NETのサンプル・プログラム4

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

ABCD
サンプル・プログラム4の実行結果

 まず、変数に固定長のサイズを与えることはできないため、代入する時点で長さを強制する必要がある。その際、ここではLSet関数を使用しているが、LSet関数は常に固定長の文字列を返すので、固定長変数と類似の結果を得やすい。LSet関数は指定長さに足りないときは空白文字を足して長さを揃えてくれる。これに対してLeft関数は、引数に渡した文字列の長さが指定長よりも短いときは、文字列をそのまま返すので(指定長よりも短い文字列を返すので)挙動が違ってくる。

 さて、少々資料を調べると、VBFixedString属性により文字列の長さを指定できるという記述に出合う。一見、これを使うとVB 6と同じような固定長文字列変数が確保できるかのように思えるが、実際にはできない。以下は、それを試みて失敗した例である(このソースは、Loadイベント(Form1_Loadメソッド)以外に必要なコードを含んでいる)。

 1: Public Class Form1
 2:   Inherits System.Windows.Forms.Form
 3:
 4: #Region " Windows フォーム デザイナで生成されたコード "
 5:
 6:   <VBFixedStringAttribute(4)> Private s As String
 7:   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 8:     '<VBFixedStringAttribute(4)> Dim s As String 'ローカル変数に属性を適用することはできません。
 9:     s = "ABCDEF"
10:     Trace.WriteLine(s)
11:   End Sub
12: End Class
VBFixedString属性を使用したVB.NETのサンプル・プログラム5

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

ABCDEF
サンプル・プログラム5の実行結果

 まず、8行目のようにローカル変数にVBFixedString属性を付けようとするとエラーになる。この属性は、フィールドにしか付かないと定義されているためだ。そこで、8行目はコメント・アウトして、この定義を6行目に移動させ、フィールドとしてみた。すると、VBFixedString属性は問題なく記述し、ビルド・エラーも発生しない。しかし実行すると、この変数sには、4文字以上の文字が格納されていることが分かるだろう。

 結論をいえば、VBFixedString属性は入出力時の文字列の長さを指定するためのもので、固定長文字列変数を実現するためのものではない。そのため、一定の文字数以上の文字を格納できない文字列変数として使うことはできない。

 VBFixedString属性を活用して入出力する事例は、次回に別途取り上げる。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第3回 構造体の宣言とその効能
  1.行番号使用時のコロン(:)記号 
    2.構造体宣言
    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 記事ランキング

本日 月間