こんにちは。ゆとり(@yutori_techblog)です。
この記事では、C#の「リテラル」について、超初心者向けに分かりやすく解説します!
目次
簡単な説明
まずは導入編として、本質的ではありませんが、直感的に理解しやすい説明をします。
「リテラル」=1,2,3とか”abc”のこと
リテラルとは、1,2,3とか、“abc”みたいな、コードに直接書いた数字や文字のことです。
int num = 10; //「10」←リテラル
string str = "こんにちは"; //「"こんにちは"」←リテラル
このように、コード上に直接書いた数字とか文字列のことを「リテラル」と呼びます。
どうですか?とても簡単ですね!
ただし、この説明はわかりやすさを重視した導入篇ですので、リテラルについての理解を深めるために次の説明に進みましょう!
詳しい説明
前項の説明は簡潔でとても分かりやすかったと思いますが、この項ではさらに踏み込んだ解説を行います。
この内容を理解すれば、リテラルについてはマスターしたと思ってもらって構いません。
「リテラル」=コード上に直接書いたオブジェクトインスタンス
リテラルとは、コード上に直接書いたオブジェクトインスタンスのことです。
インスタンスはわかりますでしょうか?new演算子を使うアレですね。
例えば、人を表すPersonクラスのインスタンスを生成するにはnew Person();するんでしたね。
Person person = new Person(); //Personクラスのインスタンスを生成
このように、普通はインスタンスを生成するためにはnew演算子を使います。ところが…
リテラルはインスタンスである
リテラルは、インスタンスです。
C#コード上に直接書かれた1,2,3などの数字は、実はInt32構造体のインスタンスとして認識されます。
同様に、”abc”などの文字列は、Stringクラスのインスタンスとして認識されます。
先ほど説明したように、普通のオブジェクトはインスタンスを生成するとき、new演算子を使います。
ところが、リテラルの場合はnew演算子を使うことなく、即座にインスタンスが生成されます。
int num = 5; //Int32構造体のインスタンス生成
「5」と書いただけで、Int32構造体のインスタンスが生成されています。
「5」自体が、Int32構造体のインスタンスです。
どういうことか、確かめてみましょう。
リテラルがインスタンスであることを確かめる
「リテラルがインスタンスである」とはどういうことでしょうか?
実は、様々な方法で「リテラルがインスタンスである」ということを身をもって体感することができます。
ここでは、その方法をいくつかご紹介します。
「5」がInt32構造体のインスタンスであることを確かめる
VisuaiStudioで「5」と入力して、その上にマウスポインタを当ててみてください。

struct System.Int32 と表示されていますね。
すなわち、「5」はInt32構造体のインスタンスであるということがわかります。
さらに、今度は「.(ドット)」を入力してみます。

使用可能なInt32構造体のメンバが表示されます。
これらはインスタンスメソッド(staticではないメソッド)ですから、このことからも「5」がInt32構造体のインスタンスである、ということがわかると思います。
今度は、下記のようなソースコードを入力して実行してみます。
ソースコード
public static void Main(string[] args)
{
bool ans56 = 5.Equals(6);
Console.WriteLine($"5と6は等しいか?:{ans56}");
bool ans55 = 5.Equals(5);
Console.WriteLine($"5と5は等しいか?:{ans55}");
}
Int32構造体のEqualsメソッドを使って、整数リテラル同士を直接比較していますね。
「5」はInt32構造体のインスタンスなので、通常通りインスタンスメソッドが使用できてしまいます。
実行結果
5と6は等しいか?:False
5と5は等しいか?:True
動作も問題なさそうです。
このように、整数リテラル「5」がInt32構造体のインスタンスであることがおわかりいただけたと思います。
“abcde”がStringクラスのインスタンスであることを確かめる
今度は文字列リテラル”abcde”がStringクラスのインスタンスであることを確かめてみます。
また、例によってVisualStudioで”abcde”と入力して、マウスカーソルを当ててみましょう。

しっかりとStringクラスのインスタンスであると認識されていますね。
しかし、面白いのはここからです。
実は、StringクラスはIEnumerable<char>インターフェイスを実装しているので、foreachで回すことができてしまいます。
ソースコード
public static void Main(string[] args)
{
foreach (var chr in "abcde")
{
Console.WriteLine(chr);
}
}
“abcde”という文字列をforeachで回すというのはなんとも不思議な感じがしますが…
実行結果
a
b
c
d
e
きちんと実行できています。
文字列リテラル”abcde”がStringクラスのインスタンスであると認識されているが故ですね。
まとめ
以上をまとめると次のようになります。
- リテラルとは、1,2,3とか、”abc”のようなコードに直接書いた数値や文字列のこと
- リテラルは、オブジェクトのインスタンスそのものである
補足すれば、trueやfalseはBoolean構造体のインスタンスですし、「5」ではなく「5d」と書けばDouble構造体のインスタンスになりますよ。
リテラルは他にもあるので、興味があれば調べてみてください。
以上となります!皆様のお役に立てれば幸いです。
ご意見、ご質問等ございましたら、コメントもしくはTwitterへお気軽にお寄せください!