きっかけは、その方の別のご質問に
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 を追加
[2013/04/17] タイトルに VB を追加
0 件のコメント:
コメントを投稿