2012年8月9日木曜日

VB 文字変数の値代入と型変換

先日、msdn Visual Basic フォーラムでとある方のご質問に投稿していて、ちょっと、引っ掛った事がありまして ... 。
きっかけは、その方の別のご質問に
Dim NS As Integer=123
MsgBox("" & NS & "") 
というような表記があるのを見つけ、あれ~通るのコンパイラー? でした。 string & integer & string ですから ... 。
通るのですね、コンパイラー!  知らなかった。

そこで、簡単に、文字変数への値代入のプログラムを Visual Basic で書いて見ました。



プログラムで説明する前に、ちょっと。
msdn フォーラムの皆様へのご挨拶 でも書きましたが、前のプログラミング言語での習慣から、変数の定義や値代入には充分留意しているつもりです。
特に値代入が式で与えられる時は気を付けています。
エディターで変数や定数にマウスのフォーカスをあて各項目の型が揃う様にしています。
ですから、冒頭に書いたように、え~ ... となるのですが。


先ずは、VB で Button / Label / Textbox  を 1 / 5 / 1  個配置して下さい。
Textbox1 のみ Textbox5 に名称変更して下さい。
ソースコードは次の通りです。
Option Strict On                    'Strict Off とすると... (LetsTry:C)  Default:on
Public Class Form1
    Dim intSet As Integer
    Dim strSet As String

    Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        intSet = 123
        strSet = "IntSet = "
        Me.Label1.Text = strSet
        Me.Label2.Text = intSet.ToString
        Me.Label3.Text = ""
        Me.Label4.Text = ""
        Me.Label5.Text = ""
        Me.Label5.ForeColor = Color.Brown
        Me.TextBox5.ForeColor = Color.Brown
        Me.TextBox5.Width = 120
        Me.Text = "文字連結と&の取扱"
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim showHead_3 As String = "& 連結 : "
        Dim showHead_4 As String = "+ 連結 : "
        Me.Label3.UseMnemonic() = False                 '&のアクセス機能指定を解除>&を文字として表示可能 (LetsTry:A)  Default:Alive
        Me.Label3.Text = showHead_3 & strSet & intSet
        'Me.Label4.Text = showHead_4 + strSet + intSet   'CommentOutせず実行すると... (LetsTry:B)  Default:CommentOut
        Me.Label4.Text = showHead_4 + strSet + intSet.ToString
        Me.TextBox5.Text = Me.Label3.Text               'Label3.UseMnemonic()の値に係らず常に&を表示
        Me.Label5.UseMnemonic() = False                 '&のアクセス機能指定を解除>&を文字として表示可能
        Me.Label5.Text = " &Test:DoShowTop&"
    End Sub
End Class


実行時の画面見本です

プログラムではちゃんと動作するように、不用な行をコメントアウトしてあります。

これを戻すことで、コンパイラーがどう反応するか、表示がどうなるか、見てみて下さい。 (LetsTry:A)
また、
(LetsTry:B) でコメントを外して見ると ... 、
(LetsTry:C) でOption Strict Off にして見ると ... 。

文字列の連結には&と+が使えますが、+の方が厳密で、&は融通が利きます。

しかし、&の場合、他のコントロールのアクセス機能指定の役割(prefix)も併せ持つ為、Label での表示がうまく行きません。
これを回避するのが .UseMnemonic()  です。

また、Option Strict On にしても、&連結では、拡大変換と見なされ、暗黙の縮小変換エラーすらチェックされなくなります。

詳しくは Option Strict ステートメント (msdn) を参照下さい。


結果的には、Option Strict On でも Off  でも通り 矛盾を抱えないコードは
Me.Label4.Text = showHead_4 + strSet + intSet.ToString
つまり、明示的に数値型を文字型に変換した上で+で連結する式 と言う事になります。
コードを書いている時に思ったような結果を導き出すためにも。

&連結でも今回は同じ結果ですが、コンパイラー任せで、何か問題が生じた時のトレースが大変そう。
変数の型が全て揃っていれば、少しは、回避できるでしょうが ... 。

明示的に変換しない場合で、コンパイラーが右辺の連結を処理する時、左辺の変数の型には合わせてくれないのも分ります。

「+」 演算子が文字列連結に使えるのは、前後の演算項目が String 型のときだけです。VB .NET では前後の一方が数値だと加算処理として機能するので、逆に "ABC" を数値に変換しようとします。もちろん、数値に変換できません。この 2 行目は、Option Strict がオフなら実行エラーに、オンならコンパイルエラーになります

MSDN ライブラリ より抜粋  全文は VB .NET プログラミングリファレンス - 3-5 データ型変換 を参照

Visual Basic を習い始めた頃、参考書が皆&での説明でしたので、&を使う機会が多かったのですが、厳密な型指定を意識したプログラミングの場合、+を利用した方が良さそうですね。





[2012/08/09] タイトル他一ヶ所で 変数>文字変数 に語句変更
[2013/04/17] タイトルに VB を追加

0 件のコメント:

コメントを投稿