以下を行う簡単な方法はありますか?
String s = myObj == null ? "" : myObj.ToString();
私は次のことができることはわかっていますが、実際にはハックと見なしています。
String s = "" + myObj;
Convert.ToString()がこれに対して適切なオーバーロードを持っているとすばらしいでしょう。
Convert.ToString()
ば、あなたが下に書いた最初のことを正確に行います。
以下を行う簡単な方法はありますか?
String s = myObj == null ? "" : myObj.ToString();
私は次のことができることはわかっていますが、実際にはハックと見なしています。
String s = "" + myObj;
Convert.ToString()がこれに対して適切なオーバーロードを持っているとすばらしいでしょう。
Convert.ToString()
ば、あなたが下に書いた最初のことを正確に行います。
回答:
C#6.0編集:
C#6.0では、キャストなしの簡潔なバージョンの元のメソッドを使用できます。
string s = myObj?.ToString() ?? "";
または補間を使用する:
string s = $"{myObj}";
元の回答:
String s = (myObj ?? String.Empty).ToString();
または
String s = (myObjc ?? "").ToString()
さらに簡潔に。
残念ながら、指摘されているように、これをString型またはObject型以外で機能させるには、どちらかの側にキャストが必要になることがよくあります。
String s = (myObjc ?? (Object)"").ToString()
String s = ((Object)myObjc ?? "").ToString()
したがって、おそらくエレガントに見えるかもしれませんが、キャストはほとんど常に必要であり、実際にはそれほど簡潔ではありません。
他の場所で提案されているように、拡張メソッドを使用してこれをよりクリーンにすることをお勧めします。
public static string ToStringNullSafe(this object value)
{
return (value ?? string.Empty).ToString();
}
string.Format("{0}", myObj);
string.Formatはnullを空の文字列としてフォーマットし、null以外のオブジェクトでToString()を呼び出します。私の理解では、これはあなたが探していたものです。
"" + myObj
。しかし、それは余分な文字列を作成することを読んだ。 str.Concat(myObj)
正常に動作するようで、「さらに高速」です。
Convert.ToString()がこれに対して適切なオーバーロードを持っているとすばらしいでしょう。
行われていますConvert.ToString(Object value)
.NET 2.0以降(約5年前に頼まれました。このQ。)あなたが欲しいものを正確に行うために表示されます:
http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
私はここで本当に明白なものを欠落/誤解していますか?
拡張メソッドを使用すると、これを実現できます。
public static class Extension
{
public static string ToStringOrEmpty(this Object value)
{
return value == null ? "" : value.ToString();
}
}
以下は画面に何も書き込まず、例外をスローしません。
string value = null;
Console.WriteLine(value.ToStringOrEmpty());
string s = "" + myObj;
がハックだと考える場合、nullオブジェクトで関数を呼び出すと、同じボートに分類されます。私はこれに反対票を投じますが、それは当面の問題を解決します、私は使用法に同意しません。NullReferenceException
拡張メソッドであっても、nullオブジェクトはをスローする必要があります。
ToStringOrEmptyWhenNull
。
this
パラメーター)の場合はスローされません。これは、それらが単なる構文上の砂糖であるためです。つまりx.SomeExtensionMethod()
ための糖衣構文であるSomeStaticClass.SomeExtensionMethod(x);
とき、このようにx
されnull
、我々は上のメソッド呼び出ししようとされていないnull
オブジェクトを渡すのではなくnull
、静的なメソッドにオブジェクトを。そのメソッドがnull
パラメータをチェックし、そのようなパラメータに遭遇したときにスローする場合に限り、null
オブジェクトで拡張メソッドが「呼び出されて」スローされます。
私はこれに同意しません:
String s = myObj == null ? "" : myObj.ToString();
とにかくハックです。これは明確なコードの良い例だと思います。何を達成したいのか、そしてnullを期待しているのは明らかです。
更新:
これはハックであるとは言っていなかったようです。しかし、あなたがこの方法は行くべき道ではないと考えるという質問に暗示されています。私の考えでは、これは間違いなく最も明確な解決策です。
string s = String.Concat(myObj);
私が推測する最短の方法であり、パフォーマンスのオーバーヘッドも無視できます。コードの読者には意図が何であるかは明確ではありませんが、覚えておいてください。
Concat
実際には、下でnullチェックを実行してstring.Empty
or を返しますarg0.ToString()
。
実は私はあなたが何をしたいのか理解できませんでした。私が理解しているように、このコードはこのように別の方法で書くことができます。あなたはこれを求めていますか?詳細を説明できますか?
string s = string.Empty;
if(!string.IsNullOrEmpty(myObj))
{
s = myObj.ToString();
}
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
私は私の答えに打ちのめされるかもしれませんが、とにかくここに行きます:
私は単に書きます
文字列s = "" if(myObj!= null){x = myObj.toString(); }
三項演算子を使用することによるパフォーマンスの見返りはありますか?頭の上がわからない。
そして明らかに、上記の誰かが述べたように、この動作をsafeString(myObj)などのメソッドに入れて再利用することができます。
いくつかの(速度)パフォーマンステストは、さまざまなオプションをまとめたものであり、実際に#microoptimization(linqpad拡張を使用)が重要であるというわけではありません)
void Main()
{
object objValue = null;
test(objValue);
string strValue = null;
test(strValue);
}
// Define other methods and classes here
void test(string value) {
new Perf<string> {
{ "coallesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
void test(object value) {
new Perf<string> {
{ "coallesce", n => (value ?? string.Empty).ToString() },
{ "nullcheck", n => value == null ? string.Empty : value.ToString() },
{ "str.Format", n => string.Format("{0}", value) },
{ "str.Concat", n => string.Concat(value) },
{ "string +", n => "" + value },
{ "Convert", n => Convert.ToString(value) },
}.Vs();
}
それを指摘することはおそらく重要です Convert.ToString(...)
null文字列を保持するがです。
Holstebroeのコメントが最良の答えです。
string s = string.Format("{0}", myObj);
もし myObj
がnullの、Formatは空の文字列値をそこに配置します。
また、1行の要件も満たし、読みやすくなっています。
これは古い質問であり、OPはC#を要求しましたが、C#ではなくVB.Netを使用するユーザーのためにVB.Netソリューションを共有したいと思います。
Dim myObj As Object = Nothing
Dim s As String = If(myObj, "").ToString()
myObj = 42
s = If(myObj, "").ToString()
残念ながら、VB.Netでは変数の後に?演算子を使用できないため、myObj?.ToStringは無効です(少なくとも、ソリューションのテストに使用した.Net 4.5では無効です)。代わりに、ifを使用して、myObjがNothingの場合に空の文字列を返します。したがって、最初のTostring-Callは空の文字列を返し、2番目の(myObjがNothingではない)は "42"を返します。