Adakah cara sederhana untuk melakukan hal berikut:
String s = myObj == null ? "" : myObj.ToString();
Saya tahu saya dapat melakukan hal berikut, tetapi saya benar-benar menganggapnya sebagai peretasan:
String s = "" + myObj;
Akan lebih bagus jika Convert.ToString () memiliki kelebihan beban yang tepat untuk ini.
Convert.ToString()
ini persis seperti hal pertama yang Anda tulis di bawahnya.Jawaban:
C # 6.0 Edit:
Dengan C # 6.0 kita sekarang dapat memiliki versi singkat dan bebas cast dari metode orignal:
Atau bahkan menggunakan interpolasi:
Jawaban Asli:
atau
menjadi lebih ringkas.
Sayangnya, seperti yang telah ditunjukkan, Anda akan sering membutuhkan cast di kedua sisi untuk membuat ini berfungsi dengan tipe non String atau Object:
Oleh karena itu, meski mungkin tampak elegan, pemerannya hampir selalu diperlukan dan tidak sesingkat itu dalam praktiknya.
Seperti yang disarankan di tempat lain, saya merekomendasikan mungkin menggunakan metode ekstensi untuk membuat ini lebih bersih:
sumber
string.Format akan memformat null sebagai string kosong dan memanggil ToString () pada objek bukan null. Seperti yang saya pahami, inilah yang Anda cari.
sumber
"" + myObj
. Tapi saya pernah membaca bahwa menciptakan string ekstra.str.Concat(myObj)
tampaknya bekerja dengan baik dan "bahkan lebih cepat".Sudah ada
Convert.ToString(Object value)
.Net 2.0 (kira-kira 5 tahun sebelum Q ini diminta), yang tampaknya melakukan apa yang Anda inginkan:http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
Apakah saya melewatkan / salah menafsirkan sesuatu yang sangat jelas di sini?
sumber
Dengan metode ekstensi, Anda dapat melakukannya:
Hal berikut tidak akan menulis apa pun ke layar dan tidak akan membuat pengecualian:
sumber
string s = "" + myObj;
hackish, memanggil fungsi pada objek null harus termasuk dalam perahu yang sama. Saya akan merendahkan ini, tetapi itu menyelesaikan masalah yang ada, saya hanya tidak setuju dengan penggunaannya. Objek nol harus dilemparNullReferenceException
, bahkan dalam metode ekstensi.ToStringOrEmptyWhenNull
.this
parameter) karena mereka hanya gula sintaksis. Itulahx.SomeExtensionMethod()
adalah sintaksis gula untukSomeStaticClass.SomeExtensionMethod(x);
Jadi, ketikax
yangnull
kita tidak mencoba untuk memanggil metode padanull
objek melainkan melewatinull
objek untuk metode statis. Jika dan hanya jika metode tersebut memeriksanull
parameter dan melempar saat menjumpainya akan metode ekstensi "dipanggil" padanull
lemparan objek.Saya tidak setuju dengan ini:
adalah peretasan dengan cara apa pun. Saya pikir ini adalah contoh yang bagus dari kode yang jelas. Sangat jelas apa yang ingin Anda capai dan bahwa Anda mengharapkan nol.
MEMPERBARUI:
Saya mengerti sekarang bahwa Anda tidak mengatakan bahwa ini adalah retasan. Tetapi tersirat dalam pertanyaan bahwa menurut Anda cara ini bukanlah cara yang tepat. Menurut saya, ini adalah solusi yang paling jelas.
sumber
akan menjadi cara terpendek yang saya kira dan juga memiliki overhead kinerja yang dapat diabaikan. Perlu diingat meskipun tidak cukup jelas bagi pembaca kode apa maksudnya.
sumber
Concat
sebenarnya melakukan pemeriksaan nol di bawah dan mengembalikanstring.Empty
atauarg0.ToString()
, yang tampaknya sedikit lebih berkinerja (maksud saya, kita berbicara tentang ms di sini).sebenarnya saya tidak mengerti apa yang ingin Anda lakukan. Seperti yang saya pahami, Anda dapat menulis kode ini dengan cara lain seperti ini. Apakah Anda menanyakan ini atau tidak? Bisakah Anda menjelaskan lebih lanjut?
sumber
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
Saya mungkin akan dihajar untuk jawaban saya tetapi ini dia:
Saya hanya akan menulis
string s = "" if (myObj! = null) {x = myObj.toString (); }
Apakah ada hasil dalam hal kinerja untuk menggunakan operator terner? Saya tidak tahu di luar kepala saya.
Dan jelas, seperti yang disebutkan seseorang di atas, Anda dapat menempatkan perilaku ini ke dalam metode seperti safeString (myObj) yang memungkinkan untuk digunakan kembali.
sumber
Saya memiliki masalah yang sama dan menyelesaikannya hanya dengan mentransmisikan objek ke string. Ini juga berfungsi untuk objek null karena string bisa berupa null. Kecuali Anda benar-benar tidak ingin memiliki string null, ini seharusnya berfungsi dengan baik:
sumber
Beberapa tes kinerja (kecepatan) meringkas berbagai opsi, bukan berarti #microoptimization benar-benar penting (menggunakan ekstensi linqpad )
Pilihan
Mungkin penting untuk menunjukkan bahwa
Convert.ToString(...)
akan mempertahankan string nol.Hasil
Obyek
Tali
sumber
Komentar Holstebroe akan menjadi jawaban terbaik Anda:
Jika
myObj
null, Format menempatkan nilai String Kosong di sana.Ini juga memenuhi persyaratan satu baris Anda dan mudah dibaca.
sumber
Meskipun ini adalah pertanyaan lama dan OP meminta C #, saya ingin membagikan solusi VB.Net untuk mereka yang bekerja dengan VB.Net daripada C #:
Sayangnya VB.Net tidak mengizinkan? -Operator setelah variabel jadi myObj? .ToString tidak valid (setidaknya tidak dalam .Net 4.5, yang saya gunakan untuk menguji solusi). Sebagai gantinya saya menggunakan If untuk mengembalikan string kosong jika myObj ist Nothing. Jadi Tostring-Call pertama mengembalikan string kosong, sedangkan yang kedua (di mana myObj bukan Nothing) mengembalikan "42".
sumber