|
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第3回 構造体の宣言とその効能
(株)ピーデー
川俣 晶
2002/04/16
|
行番号使用時のコロン(:)記号
まずは肩慣らしとして、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:までの行数表示は、掲載の都合で編集部が挿入したもの。
|
これを実行すると以下のようになる。
これに対し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 |
これを実行すると以下のようになる。
この相違は、実用上はさほど重要ではない。なぜなら、行番号の付いたソース・コードを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 |
これを実行すると以下のようになる。
変数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 |
これを実行すると以下のようになる。
まず、変数に固定長のサイズを与えることはできないため、代入する時点で長さを強制する必要がある。その際、ここでは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 |
これを実行すると以下のようになる。
まず、8行目のようにローカル変数にVBFixedString属性を付けようとするとエラーになる。この属性は、フィールドにしか付かないと定義されているためだ。そこで、8行目はコメント・アウトして、この定義を6行目に移動させ、フィールドとしてみた。すると、VBFixedString属性は問題なく記述し、ビルド・エラーも発生しない。しかし実行すると、この変数sには、4文字以上の文字が格納されていることが分かるだろう。
結論をいえば、VBFixedString属性は入出力時の文字列の長さを指定するためのもので、固定長文字列変数を実現するためのものではない。そのため、一定の文字数以上の文字を格納できない文字列変数として使うことはできない。
VBFixedString属性を活用して入出力する事例は、次回に別途取り上げる。
INDEX |
|
連載 プロフェッショナルVB.NETプログラミング |
|
第3回 構造体の宣言とその効能 |
|
1.行番号使用時のコロン(:)記号 |
|
2.構造体宣言 |
|
3.構造体の効能 |
|
Insider.NET 記事ランキング
本日
月間