リテラル
数値および文字列の値をそのまま記述したものをリテラル(literals)と呼びます。 例えば、次のように変数に代入する値として記述している値そのものが数値リテラル・文字列リテラルとなります。
整数リテラル
数値をそのまま記述した場合、整数リテラルは10進整数として扱われます。 このほか、以下のプレフィックスを前置することにより、16進・8進・2進の各基数表記で整数リテラルを記述することができます。
プレフィックス | 形式 | |
---|---|---|
C# | VB | |
0x
|
&H ,&h |
16進整数リテラル |
- |
&O ,&o |
8進整数リテラル |
0b
|
&B ,&b |
2進整数リテラル |
このほか、値の型を明示するためにサフィックスを後置することもできます。
16進整数リテラル
C#では数値リテラルにプレフィックス0x
を前置することで16進数表記で整数リテラルを記述できます。 桁揃えのために数値の先頭に0
を並べることもできます。 また、桁区切り文字としてアンダースコア_
を入れることもできます。
VBでは数値リテラルにプレフィックス&H
または&h
を前置することで16進数表記で整数リテラルを記述できます。 桁揃えのために数値の先頭に0
を並べることもできます。 また、桁区切り文字としてアンダースコア_
を入れることもできます。
ToStringメソッドによる数値の文字列化と、16進形式の書式指定子X
については書式指定子 §.X, x (hexadecimal/16進数)を参照してください。
8進整数リテラル
VBでは数値リテラルにプレフィックス&O
または&o
を前置することで8進数表記で整数リテラルを記述できます。
C#では8進数の整数リテラルを記述することはできません。 Convertクラスを用いることにより、8進数文字列⇄数値の変換を行うことができます。
16進整数形式とは異なり、8進数形式に変換する書式指定子は現在のところ定義されていないので、8進数形式で文字列化したい場合はConvertクラスを使用します。
2進整数リテラル
C# 7.0以降では、数値リテラルにプレフィックス0b
を前置することで2進数表記で整数リテラルを記述できます。 桁揃えのために数値の先頭に0
を並べることもできます。 また、桁区切り文字としてアンダースコア_
を入れることもできます。
VB 15以降では、数値リテラルにプレフィックス&B
または&b
を前置することで2進数表記で整数リテラルを記述できます。 桁揃えのために数値の先頭に0
を並べることもできます。 また、桁区切り文字としてアンダースコア_
を入れることもできます。
2進数形式に変換する書式指定子B
は.NET 8以降で使用できます。 ToStringメソッドによる数値の文字列化と、2進形式の書式指定子B
については書式指定子 §.B, b (binary/2進数)を参照してください。
それ以前のバージョンで2進数形式に文字列化したい場合はConvertクラスを使用します。
整数リテラルでのオーバーフローチェックの抑止
C#では、代入の結果オーバーフローとなるような値を、メモリ上での表現を維持したまま代入したい場合はunchecked
を用います。
たとえば、値80000000(16) = 2147483648(10)はint
で扱える最大値を超えるため、これを単に代入しようとするとオーバーフローとなります。 一方、メモリ上での表現としての80000000(16)はint
として妥当な値です。 こういった場合は、unchecked
によってオーバーフローのチェックをせずに代入させることができます。
数値の型を明示するためにサフィックスを後置することもできます。 サフィックスを指定せず、var
による宣言を行う場合は、値の大きさに応じて型選択が行われます。
Convertクラスによる基数変換
Convertクラスを使うことにより、基数を指定して文字列と数値の相互変換を行うことができます。 これにより、例えば16進数表記の文字列を数値にする、あるいはその逆といったことができます。 基数として指定できる値は、2, 8, 10, 16のいずれかです。
16進数形式で表記した文字列は、ToStringメソッドに書式指定子X
を指定することでも得られます。 具体例は§.16進整数リテラルを参照してください。
また、.NET 8以降であれば、書式指定子B
を指定することで2進数形式で表記した文字列を得ることができます。 具体例は§.2進整数リテラルを参照してください。
Convertクラスや、他の手段による基数変換についてはビット演算 §.数値・文字列間での基数変換にて詳しく解説しています。
実数リテラル
実数リテラルには、通常の実数表記と、指数表記の二種類があります。 指数表記の場合、仮数部E(+|-)指数部
のように記述します。 例えば3.0×108は3.0e8
や3.0E+8
と記述します。 また、値の型(精度)を明記するためにサフィックスを付けることもできます。
Console.WriteLineメソッドでの数値の文字列化と、実数形式の書式指定子F
および指数形式の書式指定子E
については、書式指定子 §.F, f (fixed-point/固定小数点)・書式指定子 §.E, e (exponential/指数)を参照してください。
数値リテラルでの桁区切り文字
C#7以降、VB.NET 15以降では、アンダースコア_
を桁区切り文字として使用することができます。 桁区切り文字は、整数リテラルや実数リテラルに対して使うことができます。 特に2進数リテラルや実数リテラルなど、桁数が多くなりやすい数値リテラルでは、桁区切り文字を用いることで読みやすくすることができます。
一般的な数値の表記におけるカンマ,
とは異なり、桁区切り文字_
は3桁や4桁ごとに限らず、任意の位置に入れることができます。 また、場合によっては連続させることもできます。 0x
などのプレフィックスと数値の間には桁区切り文字を入れることができますが、数値とサフィックスの間に入れることはできません。
文字・文字列のリテラル
C#およびVBでは、二重引用符・ダブルクオーテーション" "
でくくることで文字列リテラルとなります。 C#では任意の1文字を引用符・アポストロフィ' '
でくくることで文字リテラル(char型)となります。 VBでは二重引用符の後ろにサフィックスC
を付けることで文字リテラルとなります。
文字列中にヌル(NUL)・タブ(TAB)・ラインフィード(LF)・キャリッジリターン(CR)などの制御文字を記述する場合、C#ではバックスラッシュ\
に続けて制御文字の記号を記述します。 VBではvbXX
などの定数や、ControlCharsクラスのフィールドを参照します。 文字リテラルを記述する場合も同様です。
C#では、バックスラッシュ自体をエスケープする場合には、\\
のようにバックスラッシュを二つ続けて記述します。 また文字列リテラル中に二重引用符を含めたい場合は、\"
のようにバックスラッシュを使ってエスケープします。
VBでは、また文字列リテラル中に二重引用符を含めたい場合は""
のように二重引用符を二つ続けて記述します。
C#では、エスケープシーケンス\xn
および\unnnn
を使うことで文字のUnicodeコードポイントを16進数で指定してリテラルを記述できます。 \unnnn
は常に4桁でコードポイントを指定する必要がありますが、\xn
の場合桁数は可変です。 そのため、\xn
に続けて数値を記述しようとする場合、意図しないエスケープとならないよう注意する必要があります。
VBには\xn
や\unnnn
のような文字列中でコードポイントを記述するエスケープシーケンスはありません。 代わりに、ChrW関数を使うことによりUnicodeコードポイントから文字を取得することができます。
逐語的文字列リテラル
C#では通常の文字列リテラルのほかに、逐語的文字列リテラルで文字列リテラルを記述することができます。 @" "
のように文字列リテラルの二重引用符の前にアットマーク@
を前置することで逐語的文字列リテラルはとなり、逐語的文字列リテラル内では\n
や\\
などのエスケープシーケンスは無効化され、そのまま文字列化されます。
逐語的文字列リテラルを用いることにより、ファイルパスや正規表現などバックスラッシュ\
を多用する文字列を見やすく記述することができます。 逐語的文字列リテラル内ではエスケープシーケンスは無効化されるため、二重引用符を記述する場合は""
のように二つ重ねて記述します。
正規表現要素をエスケープした文字列で表現する、あるいはエスケープされている文字列から正規表現要素に変換するメソッドとして、Regex.Escape/Regex.Unescapeメソッドが用意されています。
PerlやJavaScript等の言語では/\d+/
や/\.txt$/
といった正規表現リテラルがサポートされていますが、C#およびVBでは正規表現リテラルは用意されておらず使用することはできません。 このような文字列をコード中に記述しても正規表現とは解釈されず、また正しくコンパイルされません。 正規表現を扱う方法については正規表現によるパターンマッチングと文字列操作を参照してください。
複数行の文字列リテラル
C#の逐語的文字列リテラルでは、複数行にわたる文字列を記述することもできます。 通常の文字列リテラルで複数行の文字列を記述する場合は途中に改行文字を挟む必要がありますが、逐語的文字列リテラルでは改行文字は不要です。
逐語的文字列リテラル内の改行文字はソースファイルと同じ改行文字が使われます。 ソースファイルの改行文字がCRLFなら、逐語的文字列リテラル内の改行文字もCRLFになります。
VB.NETではVB14(Visual Basic 2015)より複数行の文字列リテラルを記述することができるようになっています。 C#の逐語的文字列リテラルとは異なり、@
を前置する必要はありません。
サフィックス
数値および文字列のリテラルにサフィックスを付けることで、リテラルの型を明示的に指定することができます。 また、VBではサフィックスの他にも型文字と呼ばれる記号を付けることでも型を指定することができます。 なお、以下の表中では明記していませんが、VBでもサフィックスを小文字で指定できます。
特にリテラルを指定しない場合、数値型では(基本的には)int
/Integer
、実数型ではdouble
/Double
として扱われ、代入に際しては代入先の型に変換されます。
.NET | C# | VB | ||||||
---|---|---|---|---|---|---|---|---|
型 | 型 | サフィックス | リテラルの例 | 型 | サフィックス | 型文字 | リテラルの例 | |
整数型 | System.SByte | sbyte | - | - | SByte | - | - | - |
System.Int16 | short | - | - | Short |
S
|
- |
1024S
|
|
System.Int32 | int | - |
100000
|
Integer |
I
|
%
|
100000
100000I
100000%
|
|
System.Int64 | long |
L/l
(数字 1 (one)を混同する可能性があるため、l (small L)を使用するとコンパイル時に警告となる) |
200L
3000000000l
|
Long |
L
|
&
|
00L
3000000000&
|
|
System.Byte | byte | - | - | Byte | - | - | - | |
System.UInt16 | ushort | - | - | UShort |
US
|
- |
2048US
|
|
System.UInt32 | uint |
u/U
|
12u
12U
|
UInteger |
UI
|
- |
12UI
|
|
System.UInt64 | ulong |
ul/LU など(大文字小文字・ U とL の順序は自由) |
200ul
3000000000Lu
|
ULong |
UL
|
- |
3000000000UL
|
|
実数型 | System.Single | float |
f/F
|
1.0f
1.0F
|
Single |
F
|
!
|
1.0F
1.0!
|
System.Double | double |
d/D
|
3.14
3.14d
3.14D
|
Double |
R
|
#
|
3.14
3.14R
3.14#
|
|
System.Decimal | decimal |
m/M
|
0.66666666m
0.66666666M
|
Decimal |
D
|
@
|
0.66666666D
0.66666666@
|
|
文字・文字列型 | System.Char | char | - |
'A'
|
Char |
C
|
- |
"A"C
|
System.String | string | - |
"ABC"
|
String | - | - |
"ABC"
|
|
型 | 型 | サフィックス | リテラルの例 | 型 | サフィックス | 型文字 | リテラルの例 | |
.NET | C# | VB |
数値リテラルでは、数字とサフィックスの間に桁区切り文字を入れることはできません。
16進数表記・8進数表記などのプレフィックス付きの整数リテラルを記述する場合でも、サフィックスを付けることで型を指定することができます。
リテラルにおける暗黙的な型指定
C#のvar
による宣言では、サフィックスで型を明示しない場合、値の大きさに応じて型が暗黙的に選択されます。 例として、0x_7FFF_FFFF
以下の値はint
、0x_8000_0000
以上の値はuint
、0x_1_0000_0000
以上の値はlong
といったように、代入時にオーバーフローが起こらないような型が暗黙的に選択されます。