こんにちは!トミセンです。
JavaではメジャーなString.valueOfメソッドですが、
「C#でvalueofってどうやるの?」
「C#って、Javaと書き方が違うの?」
分かってしまえば簡単なんですが、簡単なことほど情報を見つけるのに苦労しがちで、思ったより時間がかかってしまいますよね。
今回はそんなお悩みを解決します。ずばり!
「C# valueofするには?Javaとの違いを比較」についてご紹介します。
それでは一緒に学んでいきましょう!
- C#でJavaのvalueofメソッドが使いたい人
- C#とJavaの違いが知りたい人
C# valueofするには?
確認:Javaのvalueofメソッドは?
念のため、Javaのvalueofメソッドを確認しておきます。
valueofメソッドは、数値型、小数点型の値をString型に変換するために使用します。
toStringメソッドと似ていますが、変換する対象の値がnullの場合に違いがあります。
- toStringは、例外が発生
- valueOfは、String型の”null”を返す
つまり、nullの可能性がある場合は、valueOfメソッドの方が安全ということですね。
次は、C#のにvalueofメソッドについて紹介します。
結論:C#にvalueofメソッドはない
端的に結論を言うと、C#にvalueofメソッドはありません。
「それでも使いたい」って人がいるかもしれないので、作ってみました!
C#で作るとこんな感じになります。次ぎのソースを見てください。
public class Test
{
public void Main()
{
int? number = null;
Console.WriteLine($"'{StringHelper.ValueOf(number)}'");
// 【実行結果】
// 'null'
int? number2 = 3;
Console.WriteLine($"'{StringHelper.ValueOf(number2)}'");
// 【実行結果】
// '3'
}
}
public static class StringHelper
{
/// <summary>
/// valueOfメソッド
/// </summary>
public static string ValueOf(object obj)
{
return (obj == null) ? "null" : obj.ToString();
}
}
stringクラスを継承は出来ないので、ヘルパークラスで実装しました。
引数がnullなら、文字列“null”を返して、それ以外はToString()した結果を返します。
もう少し、C#っぽく書くとこんな感じにも書けます。
public class StringHelper
{
/// <summary>
/// valueOfメソッド
/// </summary>
public static string ValueOf(object obj)
{
return obj?.ToString() ?? "null";
}
}
見慣れない書き方になっていますよね??.とか、??あたりがそう感じるはずです。
それぞれ、
- 「?.」は、null条件演算子
- 「??」は、null合体演算子
といいます。
null条件演算子は、?.の左側がnullならnullを返して、それ以降を処理しません。obj?.ToString()だと、objがnullだったらnullを返して、objがnull以外ならToString()をするという意味になります。
null合体演算子は、??の左側の結果がnullなら、右側を返します。obj?.ToString() ?? "null";で言うと、obj?.ToString()がnullなら、"null"を返すという意味になります。
つまり、(obj == null) ? “null” : obj.ToString();と同じ結果が返ってきます。
Javaとの違いを比較
C#ではどうしているの?
C#ではどうしているんだろう?って考えてみました・・・。
でもあまり、文字列”null”を意識した記憶はありません。
試しにnullをToString()してみるとどうなるでしょうか。
次にで試してみます。
C#のToString()はどうなる?
実際に、nullのToString()を試してみました。
次のソースを見てください。
public class Test
{
public void Main()
{
int? number3 = null;
Console.WriteLine($"'{number3.ToString()}'");
// 【実行結果】
// ''
}
}
例外が発生しませんでした。
私の記憶だと例外が発生するような気がしていたんですが、C#のバージョンが上がって挙動が変わったのかもしれません。
ちなみに検証環境は、Visual Studio Community 2017です。
null値をToStringする時に、””・nullを返すか明示的にしたい方は、こちらの「【C# 拡張メソッド】nullをToString()」の記事をどうぞ。
例外が発生しないなら、わざわざValueOfメソッドを作る理由がないような気がします。
時々ログのためだけに、ValueOfメソッドのように文字列”null”を表示することはありますが、実際のコーディングで見かけたことはありません。
まとめ
C#ではstring.IsNullOrEmpty()があるからでしょうか。string型の””とnullを区別する場面は見たことがありません。
そういう意味では、C#でValueOfメソッドを使うのはC#っぽくないコーディングになっているかもしれません。
string.IsNullOrEmpty()メソッドに興味がある方は、こちらの「C# IsNullOrEmpty null・空の判定と使い方のポイント!」の記事を参考にしてください。
それでは、また。