[VB.NET] リテラル型文字

2014年1月4日

 VB.NET には「リテラル型文字」というものがあって、リテラルに変数型を指定することができます。
 http://msdn.microsoft.com/ja-jp/library/s9cz43ek.aspx

 多くの場合、暗黙変換とかで事なきを得ますが、気にしておかないといけないのは 16進数との比較とか。たとえば以下の If 文は False なので、Then ブロックは実行されません。
 16進数表示指定で 8000 を表示し、その数値を &H8000 で比較しているのにも関わらずです。

Sub Main()
    Dim a As Short = -32768

    Console.WriteLine("{0:x}", a)

    If a = &H8000 Then
        ' 通らない
    Else
        Console.WriteLine("False")
    End If
End Sub

 結果

8000
False
続行するには何かキーを押してください . . .

 Then ブロックを実行するためには、If 文を以下のように書く必要があります。

    If a = &H8000S Then

 つまり &H8000 だと Int32(=Integer) 型で認識され、Int32 型の (8000)16 は 32768 と評価されるため、If の結果が False となります。
 &H8000S だと Int16(=Short) 型として認識され、Int16 型の (8000)16 は -32768 と評価されるため、If の結果が True になります。

 Select Case を使用すると「表現できない」と警告が出る場合がありますが、If の場合は警告が出ないので要注意です。

 また、あまり使うことはないかもしれませんが、SByte にはリテラル型文字がないので、負の領域と比較する場合は SByte を Short にキャストしてから比較するなどの手段を検討する必要があります。

Dim a As SByte = -128
If CShort(a) = &HFF80S Then

 いや、その頭の FF が気に入らない、とかだと Byte 型に変換した後に比較するとか。(Byte 型にも リテラル型文字はないので、以下は Int32 に暗黙変換されて比較されます)

Dim a As SByte = -128
If BitConverter.GetBytes(a)(0) = &H80 Then

 VB のリテラル型文字一覧

------- 数値型
S       Short       例) a = 10S
I       Integer
L       Long
D       Decimal
F       Single
R       Double
US      UShort
UI      UInteger
UL      ULong

------- 文字型
c       Char        例) a = "A"c





カテゴリー: Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org