§1 リテラル

数値および文字列の値をそのまま記述したものをリテラルと呼びます。 例えば、次のように変数に代入する値として記述している値そのものが数値リテラル・文字列リテラルとなります。

数値リテラルと文字列リテラル
int i = 16; // 数値リテラル
string s = "Hello!, world"; // 文字列リテラル

§1.1 整数リテラル

C#では数値リテラルにプレフィックス0xを付けることで16進数で表された整数リテラルを記述できます。 VBでは&Hを付けることで16進数の整数リテラルとなります。

using System;

class Sample {
  static void Main()
  {
    int a = 100;    // 10進数で表された数値'100'
    int b = 0x100;  // 16進数で表された数値'100'
    int c = 0xFFFF; // 16進数で表された数値'FFFF'
    int d = 0xabcd; // 16進数で表された数値'abcd'

    Console.WriteLine(a);
    Console.WriteLine(b);
    Console.WriteLine(c);
    Console.WriteLine(d);
    Console.WriteLine();

    // 変数の値を16進数の文字列に変換して表示
    Console.WriteLine(a.ToString("X"));
    Console.WriteLine(b.ToString("X"));
    Console.WriteLine(c.ToString("x")); // A-Fを小文字で表記する
    Console.WriteLine(d.ToString("X")); // A-Fを大文字で表記する
  }
}
実行結果
100
256
65535
43981

64
100
ffff
ABCD

VBでは&Oを付けることで8進数の整数リテラルを記述できます。 C#では8進数の整数リテラルを記述することはできません。

Imports System

Class Sample
  Shared Sub Main()
    Dim a As Integer = &O10     ' 8進数で表された数値'10'
    Dim b As Integer = &H10     ' 16進数で表された数値'10'
    Dim c As Integer = 10       ' 10進数で表された数値'10'

    Console.WriteLine(a)
    Console.WriteLine(b)
    Console.WriteLine(c)
  End Sub
End Class
実行結果
8
16
10

このほか2進数などのリテラルを記述することはできませんが、Convertクラスを使うことにより基数を指定して文字列との相互変換を行うことができます。

using System;

class Sample {
  static void Main()
  {
    Console.WriteLine("(128)10 = ({0})2",  Convert.ToString(128, 2));  // 10進数の値128を2進数で表記された文字列に変換
    Console.WriteLine("(128)10 = ({0})16", Convert.ToString(128, 16)); // 10進数の値128を16進数で表記された文字列に変換
    Console.WriteLine();

    Console.WriteLine("b100 = {0}",  Convert.ToInt32("100", 2));    // 文字列"100"を2進数で表された数値としてintに変換
    Console.WriteLine("0x100 = {0}", Convert.ToInt32("100", 16));   // 文字列"100"を16進数で表された数値としてintに変換
  }
}
実行結果
(128)10 = (10000000)2
(128)10 = (80)16

b100 = 4
0x100 = 256

Convertクラスを使った変換について詳しくは基本型の型変換 §.基数を指定した変換 (Convert.ToXXX)で解説しています。

§1.2 実数リテラル

実数リテラルには、通常の実数表記と、指数表記の二種類があります。 指数表記の場合、仮数部E(+|-)指数部のように記述します。 例えば3.0×1083.0e83.0E+8と記述します。 また、値の型(精度)を明記するためにサフィックスを付けることもできます。

using System;

class Sample {
  static void Main()
  {
    float   fpi = 3.14f;  // float型の実数リテラル
    double  dpi = 3.14;   // double型の実数リテラル

    float   fc  = 3.0e+8f; // 3.0×10^8
    double  dc  = 3.0e+8;  // 3.0×10^8

    float   fg  = 9.80665e-2f; // 9.80665×10^-2
    double  dg  = 9.80665e-2;  // 9.80665×10^-2

    // 実数形式・指数形式でそれぞれの値を表示
    Console.WriteLine("{0:F}, {0:E}", dc);
    Console.WriteLine("{0:F}, {0:E}", dg);
  }
}
実行結果
300000000.00, 3.000000E+008
0.10, 9.806650E-002

§1.3 文字・文字列のリテラル

C#およびVBでは、二重引用符・ダブルクオーテーション" "でくくることで文字列リテラルとなります。 C#では任意の1文字を引用符・アポストロフィ' 'でくくることで文字リテラル(char型)となります。 VBでは二重引用符の後ろにサフィックスCを付けることで文字リテラルとなります。

文字列リテラル・文字リテラル
string s = "Hello, world!"; // 文字列リテラル
char c = 'X'; // 文字リテラル

文字列中にヌル(NUL)・タブ(TAB)・ラインフィード(LF)・キャリッジリターン(CR)などの制御文字を記述する場合、C#ではバックスラッシュ\に続けて制御文字の記号を記述します。 VBではvbXXなどの定数や、ControlCharsクラスのフィールドを参照します。 文字リテラルを記述する場合も同様です。

C#では、バックスラッシュ自体をエスケープする場合には、\\のようにバックスラッシュを二つ続けて記述します。 また文字列リテラル中に二重引用符を含めたい場合は、\"のようにバックスラッシュを使ってエスケープします。

VBでは、また文字列リテラル中に二重引用符を含めたい場合は""のように二重引用符を二つ続けて記述します。

文字列リテラル中の制御文字・エスケープ
string nul  = "NUL = \0";
string tab  = "TAB = \t";
string cr   = "CR  = \r";
string lf   = "LF  = \n";
string bksl = "back slash = [\\]";
string dbqt = "double quotation = [\"]";

C#では、エスケープシーケンス\xnおよび\unnnnを使うことで文字のUnicodeコードポイントを16進数で指定してリテラルを記述できます。 \unnnnは常に4桁でコードポイントを指定する必要がありますが、\xnの場合桁数は可変です。 そのため、\xnに続けて数値を記述しようとする場合、意図しないエスケープとならないよう注意する必要があります。

エスケープシーケンス\xと\u
using System;

class Sample {
  static void Main()
  {
    Console.WriteLine("\x61");      // 0x61(U+0061) 'a' が表示される
    Console.WriteLine("\x6100");    // 0x6011(U+6100) '愀' が表示される
    Console.WriteLine("\x061");     // 0x61(U+0061) 'a' が表示される
    Console.WriteLine("\x0061");    // 0x61(U+0061) 'a' が表示される
    Console.WriteLine("\x006100");  // 0x61(U+0061) 'a' と '00'が表示される
    Console.WriteLine();

    Console.WriteLine("\u0061");    // 0x61(U+0061) 'a' が表示される
    Console.WriteLine("\u6100");    // 0x6011(U+6100) '愀' が表示される
    Console.WriteLine("\u006100");  // 0x61(U+0061) 'a' と '00'が表示される
  }
}
実行結果
a
愀
a
a
a00

a
愀
a00

VBには\xn\unnnnのような文字列中でコードポイントを記述するエスケープシーケンスはありません。 代わりに、ChrW関数を使うことによりUnicodeコードポイントから文字を取得することができます。

Imports System

Class Sample
  Shared Sub Main()
    Console.WriteLine(ChrW(&H61)) ' "a" が表示される
  End Sub
End Class

§1.4 逐語的文字列リテラル

C#では通常の文字列リテラルのほかに、逐語的文字列リテラルで文字列リテラルを記述することができます。 @" "のように文字列リテラルの二重引用符の前にアットマーク@を前置することで逐語的文字列リテラルはとなり、逐語的文字列リテラル内では\n\\などのエスケープシーケンスは無効化され、そのまま文字列化されます。 そのため、ファイルパス正規表現などバックスラッシュ\を多用する文字列を見やすく記述することができます。 エスケープシーケンスは無効化されるため、逐語的文字列リテラル内で二重引用符を記述する場合は""のように二つ重ねて記述します。

using System;
using System.Text.RegularExpressions;

class Sample {
  static void Main()
  {
    // 通常の文字列リテラルと逐語的文字列リテラルの例
    string s1 =  "abc\n\"def\"\x67\x68\x69";
    string s2 = @"abc\n""def""\x67\x68\x69";

    Console.WriteLine(s1);
    Console.WriteLine(s2);
    Console.WriteLine();

    // 通常の文字列リテラルと逐語的文字列リテラルでファイルパスを記述する例
    string path1 = "C:\\Windows\\Microsoft.NET\\Framework";
    string path2 = @"C:\Windows\Microsoft.NET\Framework";

    Console.WriteLine(path1);
    Console.WriteLine(path2);
    Console.WriteLine();

    // 通常の文字列リテラルと逐語的文字列リテラルで正規表現を記述する例
    Regex regex1 = new Regex("\\d{1,3}(\\.\\d{1,3}){3}(/\\d{1,2})?");
    Regex regex2 = new Regex(@"\d{1,3}(\.\d{1,3}){3}(/\d{1,2})?");

    Console.WriteLine(regex1);
    Console.WriteLine(regex2);
    Console.WriteLine();
  }
}
実行結果
abc
"def"ghi
abc\n"def"\x67\x68\x69

C:\Windows\Microsoft.NET\Framework
C:\Windows\Microsoft.NET\Framework

\d{1,3}(\.\d{1,3}){3}(/\d{1,2})?
\d{1,3}(\.\d{1,3}){3}(/\d{1,2})?

PerlやJavaScript等の言語では/\d+//\.txt$/といった正規表現リテラルがサポートされていますが、C#およびVBでは正規表現リテラルは用意されておらず使用することはできません。 このような文字列をコード中に記述しても正規表現とは解釈されず、また正しくコンパイルされません。 正規表現を扱う方法については正規表現によるパターンマッチングと文字列操作を参照してください。



§1.4.1 複数行の文字列リテラル

C#の逐語的文字列リテラルでは、複数行にわたる文字列を記述することもできます。 通常の文字列リテラルで複数行の文字列を記述する場合は途中に改行文字を挟む必要がありますが、逐語的文字列リテラルでは改行文字は不要です。

using System;

class Sample {
  static void Main()
  {
    string s1 = @"line1
line2
line3";
    string s2 = "line1\n" +
                "line2\n" +
                "line3";

    Console.WriteLine(s1);
    Console.WriteLine();
    Console.WriteLine(s2);
    Console.WriteLine();
  }
}
実行結果
line1
line2
line3

line1
line2
line3

逐語的文字列リテラル内の改行文字はソースファイルと同じ改行文字が使われます。 ソースファイルの改行文字がCRLFなら、逐語的文字列リテラル内の改行文字もCRLFになります。


VB.NETではVB14(Visual Basic 2015)より複数行の文字列リテラルを記述することができるようになっています。 C#の逐語的文字列リテラルとは異なり、@を前置する必要はありません。

Imports System

Class Sample
  Shared Sub Main()
    Dim s As String = "line1
line2
line3"

    Console.WriteLine(s)
  End Sub
End Class
実行結果
line1
line2
line3

§2 サフィックス

数値および文字列のリテラルにサフィックスを付けることで、リテラルの型を明示的に指定することが出来ます。 また、VBではサフィックスの他にも型文字と呼ばれる記号を付けることでも型を指定することが出来ます。 なお、以下の表中では明記していませんが、VBでもサフィックスを小文字で指定できます。

特にリテラルを指定しない場合、数値型ではint/Integer、実数型ではdouble/Doubleとして扱われ、代入に際しては代入先の型に変換されます。

サフィックスとリテラルの例
.NET Framework 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 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など
(大文字小文字・ULの順序は自由)
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 Framework C# VB

16進数・8進数表記の整数リテラルを記述する場合でも、プレフィックスと組み合わせてサフィックスを付けることで型を指定することが出来ます。

using System;

class Sample {
  static void Main()
  {
    // 10進数リテラルとサフィックス
    Console.WriteLine("{0} {1}", 100,  (100).GetType());
    Console.WriteLine("{0} {1}", 100u, (100u).GetType());
    Console.WriteLine("{0} {1}", 100L, (100L).GetType());

    // 16進数リテラルとサフィックス
    Console.WriteLine("{0} {1}", 0x100,  (0x100).GetType());
    Console.WriteLine("{0} {1}", 0x100u, (0x100u).GetType());
    Console.WriteLine("{0} {1}", 0x100L, (0x100L).GetType());
  }
}
実行結果
100 System.Int32
100 System.UInt32
100 System.Int64
256 System.Int32
256 System.UInt32
256 System.Int64