こんにちは、村正です!
今回はstring型の空文字を表す際に使用する「””」と「string.Empty」について紹介していきたいと思います。
“”とstring.Emptyは同じ
「””」と「string.Empty」は同じです。
実際にObject.ReferenceEquals()メソッドで参照が同じか(つまりインスタンスが同じか)を確認してみると、「True」つまり「同じ参照(同じインスタンス)」であることがわかります。
string hoge1 = "";
string hoge2 = string.Empty;
Console.WriteLine(Object.ReferenceEquals(hoge1, hoge2)); // True
先ほどのコードですが、hoge1とhoge2は別のインスタンス(の参照)を格納しているように見えます。
普通のクラスだったら確実に「False(参照が違う)」になりますよね。
User user1 = new User();
User user2 = new User();
Console.WriteLine(Object.ReferenceEquals(user1 , user2 )); // Flase:別のインスタンスを参照
知らなかったのですが、C#のstring型は「同じ文字列であれば同じインスタンスを使いまわす」という仕様があるようです(インターンプール)。
string hoge1 = "こんにちは";
string hoge2 = "こんにちは";
Console.WriteLine(Object.ReferenceEquals(hoge1, hoge2)); // True:同じインスタンスを参照
ちなみに「null」と「string.Empty」は違います。
string hoge1 = null;
string hoge2 = string.Empty;
Console.WriteLine(Object.ReferenceEquals(hoge1, hoge2)); //False
すこし脱線してしまいましたが、“”とstring.Emptyは同じというわけです。
string.Emptyを使うべき理由
「””」と「string.Empty」は同じ
であるならば、空文字を表すとき「””」と「string.Empty」はどちらを使うべきなのか…。
結論から言うと「string.Empty」を使うべきです。
なぜなら「可読性」と「安全性」が高まるからです。
可読性が高い
以下のコードがあったとき、「これは空文字でいいのかな?文字列を指定し忘れてない?大丈夫??」といった疑問が出てくる可能性があります。
string hoge1 = ""; // 空文字でいいよね?書き忘れて無いよね?
しかし「string.Empty」を使うと「空文字だ!」と確信できます。
string hoge1 = string.Empty; // これは空文字で間違いないな。
安全性が高い
以下のように、本来は空文字を指定する部分に対して”手が滑って”以下みたいに書いてしまった場合を考えてみましょう。
// 空文字
string hoge1 = "a";
当然ビルドエラーは起きないので、実行して「なんかおかしいぞ!?」となってみないとミスに気が付けません。
対して「string.Empty」を使うとビルドエラーになるのですぐにミスに気が付きます。
// 空文字
string hoge1 = astring.Empty; // ビルドエラー:astring.Emptyってなんぞ!?
もちろんほかの部分で空文字を””と書いているのであれば「string.Empty」ではなく「””」とするべきでしょう。しかし、基本的に空文字を指定するときは「string.Empty」を使ったのほうが良いです。
まとめ
- “”とstring.Emptyは同じインスタンス。どちらを使ってもいい。
- でもstring.Emptyの方が可読性が高くて安全。
これからは「””」ではなく「string.Empty」を使いましょう。
コメント