【C#】””とstring.Emptyは同じ!でもstring.Emptyを使うべき理由

プログラミング

こんにちは、村正です!

今回は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」を使いましょう。

コメント