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

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

昨日、AscWとChrWは特別に定数として評価されるという記事を書いたのですが、AscChr も特別に定数として評価される事を書いておきます。

AscChr は実行時の文字コードにより返す値が変わります。そのため、実行時にならないと分からない範囲の文字は定数にできません。 AscWChrWUnicode のコードポイントを返すと決まっているので AscChr で定数にできない文字も定数にできます。 今は Unicode の時代なので、今後新規のコードで AscChr を使うことはありません。 .NET Core 2.x にも当然 AscChr は含められておらず、今後もサポートされることはおそらくないでしょう。

AscChr も特別に定数として評価される事実は知識の片隅に置いておくと、もしかしたら Shift_JIS / cp932 など DBCS 前提の非常に古いコードのリーディングで役立つかもしれません。

コード

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

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

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

        ' 文字コードが実行時に決まるので定数にできない
        ' Const ascあ = Asc("あ")
        Dim ascあ = Asc("あ")
        WriteLine(ascあ)

        Const chr65 = Chr(65)
        WriteLine(chr65)

        ' 文字コードが実行時に決まるので定数にできない
        ' Const chr_32096 = Chr(-32096)
        Dim chr_32096 = Chr(-32096)
        WriteLine(chr_32096)

        Console.ReadKey()
    End Sub
End Module

実行結果 (例)

System.Int32 65
System.Int32 65
System.Int32 -32096
System.Char A
System.Char あ