Y121516 の大館お役立ち日記

秋田県大館市での生活

AscWとChrWは特別に定数として評価される

AscWChrW は特別に定数として評価される

Visual Basic で定数を定義する時には Const ステートメントを用います。

Const Statement (Visual Basic) | Microsoft Docs

        Const constInteger = 42
        Const constChar = "c"c
        Const constString = "string"

必ず何かで初期化する必要があり、= の後ろの部分は initializer と呼ばれています。 この initializer には通常、変数や関数呼び出しを置くことができないと決まっているのですが、 例外が幾つかあり単純な AscW 呼び出しと単純な ChrW 呼び出しがその例外の中に含められています。

どういうわけか ChrW も定数として評価されると今のドキュメントに書かれていないようですが、間違いなく定数として 使えます。隠し機能などではなく単に書き忘れでしょう。

これらの呼び出しはVisual Basicコンパイラが簡単に定数として計算できます。ユーザーは定数として評価できる関数を書くことができませんが、コンパイラAscW 呼び出しと ChrW 呼び出しを特別に処理します。このような特別な処理を「コンパイラマジック」などと呼んだりします。

ちなみにAscChrも特別に定数として評価されるので、使っている方はこちらも見てください。

以下は AscWChrW が定数として評価されていることを確かめるサンプルコードです。

コード

Module Program
    Private Sub WriteLine(Of T)(obj As T)
        Console.WriteLine($"{obj.GetType()} {obj}")
    End Sub

    Sub Main()
        Const ascA1 = AscW("A"c)
        WriteLine(ascA1)

        Const ascA2 = AscW("ABC")
        WriteLine(ascA2)

        Const ascあ = AscW("あ")
        WriteLine(ascあ)

        Const chr65 = ChrW(65)
        WriteLine(chr65)

        Const chr12354 = ChrW(12354)
        WriteLine(chr12354)

        Console.ReadKey()
    End Sub
End Module

実行結果

System.Int32 65
System.Int32 65
System.Int32 12354
System.Char A
System.Char あ

コンパイルが通りますし、もちろん正しく実行もできます。