Saya membaca Effective C # oleh Bill Wagner. Di Item 14 - Minimize Duplicate Initialization Logic , dia menunjukkan contoh berikut menggunakan fitur parameter opsional baru dalam konstruktor:
public MyClass(int initialCount = 0, string name = "")
Perhatikan bahwa ia menggunakan ""
bukannya string.Empty
.
Dia berkomentar:
Anda akan melihat [dalam contoh di atas] bahwa konstruktor kedua menetapkan "" untuk nilai default pada parameter name , bukan yang lebih umum
string.Empty
. Itu karenastring.Empty
bukan konstanta waktu kompilasi. Ini adalah properti statis yang ditentukan dalam kelas string. Karena ini bukan konstanta kompilasi, Anda tidak dapat menggunakannya sebagai nilai default untuk parameter.
Jika kita tidak dapat menggunakan string.Empty
statik dalam semua situasi, bukankah itu menggagalkan tujuannya? Saya pikir kami akan menggunakannya untuk memastikan bahwa kami memiliki cara yang tidak bergantung sistem untuk merujuk ke string kosong. Apakah pemahaman saya salah? Terima kasih.
UPDATE
Hanya komentar tindak lanjut. Menurut MSDN:
Setiap parameter opsional memiliki nilai default sebagai bagian dari definisinya. Jika tidak ada argumen yang dikirim untuk parameter itu, nilai default akan digunakan. Nilai default harus berupa konstanta.
Kemudian kita tidak dapat menggunakan System.Environment.NewLine
keduanya, atau menggunakan objek yang baru dibuat sebagai nilai default. Saya belum pernah menggunakan VS2010, dan ini mengecewakan!
sumber
Jawaban:
Untuk compiler C # 2.0, hanya ada sedikit gunanya
String.Empty
, dan dalam banyak kasus ini adalah sebuah pesimisasi, karena compiler dapat menyebariskan beberapa referensi""
tetapi tidak dapat melakukan hal yang samaString.Empty
.Dalam C # 1.1 itu berguna untuk menghindari membuat banyak objek independen yang semuanya berisi string kosong, tapi hari-hari itu sudah berlalu.
""
bekerja dengan baik.sumber
Tidak ada yang menghentikan Anda untuk menentukan konstanta Anda sendiri untuk string kosong jika Anda benar-benar ingin menggunakannya sebagai nilai parameter opsional:
const string String_Empty = ""; public static void PrintString(string s = String_Empty) { Console.WriteLine(s); }
[Sebagai tambahan, salah satu alasan untuk memilih
String.Empty
daripada""
secara umum, yang belum disebutkan dalam jawaban lain, adalah bahwa ada berbagai karakter Unicode (penyambung lebar-nol, dll.) Yang secara efektif tidak terlihat dengan mata telanjang. Jadi sesuatu yang terlihat seperti""
belum tentu string kosong, sedangkan denganString.Empty
Anda tahu persis apa yang Anda gunakan. Saya tahu ini bukan sumber bug yang umum, tetapi mungkin saja.]sumber
Dari pertanyaan awal:
Dengan cara apa string kosong bervariasi dari sistem ke sistem? Itu selalu berupa string tanpa karakter! Saya akan sangat takut jika saya menemukan implementasi di mana
string.Empty == ""
mengembalikan false :) Ini tidak sama dengan sesuatu sepertiEnvironment.NewLine
.Dari postingan bounty Counter Terrorist:
Itu pasti tidak akan terjadi.
Sementara saya pribadi akan menyukai mekanisme default yang sangat berbeda juga, cara kerja parameter opsional telah ada di .NET sejak awal - dan itu selalu berarti menyematkan konstanta ke dalam metadata, sehingga kode panggilan dapat menyalin konstanta itu ke dalam panggilan situs jika tidak ada argumen yang sesuai.
Dengan
string.Empty
itu sangat tidak ada gunanya - menggunakan""
akan melakukan apa yang Anda inginkan; itu yang menyakitkan untuk menggunakan literal string yang? (Saya menggunakan literal di mana-mana - saya tidak pernah menggunakanstring.Empty
- tapi itu argumen yang berbeda.)Itulah yang mengejutkan saya tentang pertanyaan ini - keluhan berkisar pada sesuatu yang sebenarnya tidak menyebabkan masalah nyata. Ini lebih penting dalam kasus di mana Anda ingin default dihitung pada waktu eksekusi karena sebenarnya mungkin berbeda. Misalnya, saya bisa membayangkan kasus di mana Anda ingin dapat memanggil metode dengan
DateTime
parameter dan menetapkan default ke "waktu saat ini". Saat ini, satu-satunya solusi elegan yang samar-samar saya ketahui untuk itu adalah:public void RecordTime(string message, DateTime? dateTime = null) { var realDateTime = dateTime ?? DateTime.UtcNow; }
... tapi itu tidak selalu tepat.
Kesimpulannya:
string.Empty
itu tidak ada gunanyasumber
Environment.Newline
.. Satu-satunya hal yang hilang dari contoh Anda adalah memeriksa variabel untuk null, dan memberikan pengecualian kembali ke pengembang yang mengatakan kepadanya bahwa meskipun nullable, itu tidak diterima.if(dateTime == null){ throw new ArgumentException("The dateTime parameter must be set. Nullable type used for device independent variable set.");}
atau semacam itu. Tapi saya sangat suka ini! Ada peringatan lain untuk melakukannya dengan cara Anda?Saya tidak pernah menggunakan string. Kosong, saya tidak bisa mengerti maksudnya. Mungkin itu mempermudah orang yang benar-benar baru dalam pemrograman, tapi saya ragu itu berguna bahkan untuk itu.
sumber
""
dan" "
, tetapi saya tidak bisa mengatakan itu" "
semua yang umum.Saya pikir ide di balik string. Kosong adalah meningkatkan keterbacaan. Ini tidak seperti baris baru di mana ada perbedaan antara bagaimana itu direpresentasikan pada platform yang berbeda. Sayangnya itu tidak dapat digunakan dalam parameter default. Namun, itu tidak akan menimbulkan masalah jika Anda melakukan port antara Windows dan sesuatu seperti Mono di Linux.
sumber
String.Empty
lebih mudah dibaca. . . secara pribadi, saya pikir itu sedikit gila.""
mungkin string paling umum yang pernah ada dan semua orang telah melihatnya jutaan kali, jadi bagaimana ini tidak terbaca?String.Empty
berguna seolah-olah adaInt32.Zero
.Sebagai FYI, sepertinya batasan yang sama diberlakukan pada nilai yang diteruskan ke konstruktor atribut - nilai tersebut harus konstan. Karena string.empty didefinisikan sebagai:
public static readonly string Empty
daripada konstanta aktual, ia tidak dapat digunakan.
sumber
Saya menggunakan
string.Empty
murni untuk keterbacaan.Jika orang lain perlu membaca / mengubah kode saya nanti, mereka tahu bahwa saya bermaksud memeriksa atau menyetel sesuatu ke string kosong. Menggunakan just
""
terkadang dapat menyebabkan bug dan kebingungan karena saya mungkin baru saja lupa meletakkan string yang saya inginkan di sana.Sebagai contoh:
if(someString == string.Empty) { }
vs.
if(someString == "") { }
if
Pernyataan pertama sepertinya jauh lebih disengaja dan dapat dibaca oleh saya. Karena ini hanya preferensi, saya benar-benar tidak melihat kereta-smash harus menggunakan""
sebagai gantinyastring.Empty
.sumber
Mungkin solusi terbaik untuk masalah ini adalah kelebihan metode ini, dengan cara ini:
public static void PrintString() { PrintString(string.Empty); }
sumber