リテラル
リテラルとは
プログラミングでは、例えば「int」や「return」などのプログラム言語があらかじめ用意しているキーワードや「+」「=」などの演算子を記述してプログラムの動作を書いていきます。
これらのほか、変数名、関数名などを自分で定義してコード中で使用することができます。
それ以外に、例えば画面に表示する文字列や計算に用いる数値などもコード中に記述します。
このようなコード中に直接記述される数値や文字列などの値をリテラルといいます。
static void Main(string[] args)
{
int num = 100;
string str = "abcde";
Console.WriteLine("{0}, {1}", num, str);
Console.ReadLine();
}
このコードで言えば、「100」「"abcde"」「"{0}, {1}"」がリテラルです。
文字リテラル
シングルクォーテーションで囲われた一文字を文字リテラルといいます。
文字リテラルはchar型変数に格納できます。
char c1 = 'A';
char c2 = '3';
文字列リテラル
ダブルクォーテーションで囲われた文字を文字列リテラルといいます。
文字列リテラルはstring型変数に格納できます。
string s1 = "あいうえお";
string s2 = "a";
上記はどちらも文字列リテラルです。
たとえ一文字であっても、ダブルクォーテーションで囲えば文字リテラルではなく文字列リテラルとなります。
また、数字もダブルクォーテーションで囲えばそれは文字列リテラルとなります。
以下のコードは数値の足し算ではなく文字列の結合となります。
string s1 = "123";
string s2 = "456";
Console.WriteLine(s1 + s2);
123456
文字列を数値に変換するにはデータ型の相互変換を参照してください。
文字列リテラルは変更不可能
C#では文字列リテラルを変更することはできません。
string str = "abc";
//エラー
str[0] = 'a';
//これは変数strに別の値を代入しているだけ
//(文字列リテラルの書き換えではない)
str = "def";
C#にも文字列を変更する操作はありますが、これらは正確には元データの変更ではなく変更した新しい文字列を生成して返します。
単純な文字列の結合でも結合した新しい文字列が生成されます。
string str1 = "abc";
string str2 = "def";
//"abcdef"という新しい文字列が生成される
string str3 = str1 + str2;
文字列操作をするたびに新しい文字列がどんどん生成されるわけですが、不要になった文字列は自動的にメモリから消去されるので気にする必要はありません。
数値リテラル
コード中に記述される数値は数値リテラルとなります。
整数ならばint型になり、実数(小数値)ならばdouble型になります。
マイナス値も記述できます。
int integer1 = 123;
int integer2 = -456;
double real1 = 1.23;
//実数の整数部が0の場合は省略可能
//以下は「0.5」と同義
double real2 = .5;
数値リテラルの型指定
数値リテラルに特殊な文字を付記することでデータ型を明示的に指定することができます。
//unsigned int型
uint uintNumberA = 123U;
uint uintNumberB = 123u;
//long型
long longNumberA = 123L;
long longNumberB = 123l;
//unsigned long型
ulong ulongNumberA = 123UL;
ulong ulongNumberB = 123ul;
//float型
float floatNumberA = 1.23F;
float floatNumberB = 1.23f;
//double型
double doubleNumberA = 1.23D;
double doubleNumberB = 1.23d;
//decimal型
decimal decimalNumerA = 123M;
decimal decimalNumerB = 123m;
このように、値などの語尾に付ける文字(接尾語)をサフィックスと言います。
(ちなみに接頭語はプレフィックスといいます)
サフィックスを付けた数値自体のデータ型が変更されます。
変数に格納せずにそのまま演算に使用しても指定通りのデータ型として機能します。
Console.WriteLine(10 / 4); //int型 / int型
Console.WriteLine(10d / 4); //double型 / int型
2 2.5
数値リテラルに付記するサフィックスは大文字でも小文字でも構いません。
ただ、long型だけは小文字だと「1」と「l」(小文字のL)の見分けがつきにくいので大文字にしたほうが良いです。
サフィックスが複数の場合の順序は自由で、大文字小文字の混在も可能です。
(「123UL」でも「123Lu」でも同じ)
16進数リテラル
数値リテラルの先頭に「0x」「0X」を付記すると、数値を16進数で表すことができます。
//16
int num1 = 0x10;
//4779
int num2 = 0x12AB;
//255
int num3 = 0XFf;
16進数は数値とアルファベットで表記します。
アルファベットは大文字でも小文字でも構いませんし、混在させても構いません。
(もちろん統一したほうが読みやすいですが)
10進数表記でも16進数表記でもただの整数値(int型)なので、特に扱い方が変わるわけではありません。
2進数リテラル
数値リテラルの先頭に「0b」「0B」を付記すると、数値を2進数で表すことができます。
2進数リテラルの記法はVisual Studio 2017以降で可能です。
(C# 7以降)
//2
int num1 = 0b10;
//10
int num2 = 0b1010;
//255
int num3 = 0B11111111;
2進数は「0」か「1」のみで表記します。
true/falseリテラル
true、falseは真偽値を表すリテラルです。
真偽値とは、真か偽かのどちらかを表す値です。
true、falseはbool型変数に格納できます。
bool b1 = true;
bool b2 = false;
詳しくはbool型を参照してください。
null
C#ではnullという特殊な値が存在します。
これは「何もない状態」を示すキーワードです。
いままで説明してきたデータ型でnullを値に取れるのは「string型」「object型」「配列型」です。
これらは「参照型」というグループに属するデータ型で、参照型のデータ型変数は値がnullになる可能性があります。
(int型やdouble型などは「値型」というデータ型のグループです)
static void Main(string[] args)
{
string str = null;
int[] nums = null;
//int型などの値型はnullを代入できない
//int num = null;
}
簡単に言えばstring型などは「値が何も入っていない」状態になることがある、ということです。
string型には空文字(string.Emptyや"")を代入できますが、空文字とnullは別の値です。
例えば、空文字に対して「Lengthプロパティ」は使えますが、nullに対してはエラー(例外)となります。
//ただの空文字
string strEmpty = string.Empty;
//null
string strNull = null;
//0
Console.WriteLine(strEmpty.Length);
//エラー(例外発生)
Console.WriteLine(strNull.Length);
同じように、要素数が0の配列とnullとは別の状態です。
//要素数が0の配列
int[] numsEmpty = new int[0];
//null
int[] numsNull = null;
//0
Console.WriteLine(numsEmpty.Length);
//エラー(例外発生)
Console.WriteLine(numsNull.Length);
詳しくは値型と参照型を参照してください。
string型変数のnullチェック
string型変数がnullか否かをチェックするには、「null」と比較するほか、string.IsNullOrEmptyというメソッドを使用することもできます。
これは値が「nullもしくは空文字」ならば真を、それ以外の場合に偽を返すメソッドです。
static void Main(string[] args)
{
string strEmpty = string.Empty;
string strNull = null;
if (strEmpty == string.Empty)
{
//○
}
if (strNull == string.Empty)
{
//×
}
if (strEmpty == null)
{
//×
}
if (strNull == null)
{
//○
}
if (string.IsNullOrEmpty(strEmpty))
{
//○
}
if (string.IsNullOrEmpty(strNull))
{
//○
}
}
条件判定についてはif文で解説します。