Di .NET, apa perbedaan antara String.Empty
dan ""
, dan apakah keduanya dapat dipertukarkan, atau adakah beberapa referensi mendasar atau masalah lokalisasi seputar kesetaraan yang String.Empty
akan memastikan tidak ada masalah?
.net
double-quotes
string
John
sumber
sumber
string.Empty
dan apa alasan di balik menyatakannya sebagaireadonly
ganticonst
.Jawaban:
Di .NET sebelum versi 2.0,
""
buat objek sambilstring.Empty
buat tidak ada referensi objek , yang membuatnyastring.Empty
lebih efisien.Dalam versi 2.0 dan yang lebih baru. NET, semua kemunculan
""
merujuk ke string literal yang sama, yang artinya""
setara dengan.Empty
, tetapi masih tidak secepat.Length == 0
..Length == 0
adalah pilihan tercepat, tetapi.Empty
menghasilkan kode yang sedikit lebih bersih.Lihat spesifikasi .NET untuk informasi lebih lanjut .
sumber
string.IsNullOrEmpty( stringVar )
.string.Empty
adalah bidang baca-saja sedangkan""
konstanta waktu kompilasi. Tempat-tempat di mana mereka berperilaku berbeda adalah:Nilai Parameter default dalam C # 4.0 atau lebih tinggi
Ekspresi huruf dalam pernyataan sakelar
Argumen atribut
sumber
String.Empty
argumen dalam kebanyakan kasus. Anda benar bahwa semua contoh menunjukkan ituyou simply can't put a (run-time) "value" into (compile-time) metadata
dan itulah yang ingin ditunjukkan oleh contoh tersebut.Jawaban sebelumnya benar untuk .NET 1.1 (lihat tanggal posting yang mereka tautkan: 2003). Pada. NET 2.0 dan yang lebih baru, pada dasarnya tidak ada perbedaan. JIT pada akhirnya akan merujuk objek yang sama pada heap.
Menurut spesifikasi C #, bagian 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx
Seseorang bahkan menyebutkan ini dalam komentar dari posting Brad Abram
Singkatnya, hasil praktis dari "" vs. String.Empty adalah nol. JIT akan mencari tahu pada akhirnya.
Saya telah menemukan, secara pribadi, bahwa JIT jauh lebih pintar daripada saya dan jadi saya mencoba untuk tidak terlalu pintar dengan optimasi mikro-kompiler seperti itu. JIT akan terbuka untuk () loop, menghapus kode redundan, metode inline, dll lebih baik dan pada waktu yang lebih tepat daripada yang saya atau kompiler C # bisa antisipasi sebelumnya. Biarkan JIT melakukan tugasnya :)
sumber
String.Empty
adalah readonly bidang sementara""
adalah const . Ini berarti Anda tidak dapat menggunakanString.Empty
pernyataan switch karena itu bukan konstanta.sumber
default
kata kunci kita dapat mempromosikan keterbacaan tanpa, mencegah modifikasi yang tidak disengaja, dan memiliki waktu kompilasi yang konstan, meskipun jujur saja, saya masih berpikir String.Empty lebih mudah dibaca daripada default, tetapi lebih lambat untuk mengetikPerbedaan lainnya adalah bahwa String.Empty menghasilkan kode CIL yang lebih besar. Sementara kode untuk referensi "" dan String.Empty memiliki panjang yang sama, kompiler tidak mengoptimalkan penggabungan string (lihat posting blog Eric Lippert ) untuk argumen String.Empty. Fungsi setara berikut
buat IL ini
sumber
"bar " + (ok ? "" : "error")
Jawaban di atas secara teknis benar, tetapi apa yang mungkin Anda benar-benar ingin gunakan, untuk pembacaan kode terbaik dan peluang pengecualian terkecil adalah String.IsNullOrEmpty (s)
sumber
--foo=$BAR
Anda, maka Anda mungkin ingin melihat perbedaan di antara mereka lupa mengatur env var dan mereka tidak melewati flag sama sekali.string.IsNullOrEmpty
sering merupakan bau kode yang Anda belum memvalidasi input Anda dengan benar atau melakukan hal-hal aneh. Anda biasanya tidak boleh menerima string kosong ketika Anda benar-benar bermaksud menggunakannull
, atau sesuatu seperti tipe Maybe / Option.Saya cenderung menggunakan
String.Empty
daripada""
untuk satu alasan sederhana, namun tidak jelas:""
dan""
TIDAK sama, yang pertama sebenarnya memiliki 16 karakter lebar nol di dalamnya. Jelas tidak ada pengembang yang kompeten yang akan menempatkan dan nol karakter lebar ke dalam kode mereka, tetapi jika mereka masuk ke sana, itu bisa menjadi mimpi buruk pemeliharaan.Catatan:
Saya menggunakan U + FEFF dalam contoh ini.
Tidak yakin apakah SO akan memakan karakter-karakter itu, tetapi cobalah sendiri dengan salah satu dari banyak karakter lebar nol
Saya hanya menemukan ini berkat https://codegolf.stackexchange.com/
sumber
Gunakan
String.Empty
daripada""
.Referensi:
String.Empty
vs.""
sumber
String.Empty tidak membuat objek sedangkan "" melakukannya. Perbedaannya, seperti yang ditunjukkan di sini , adalah sepele.
sumber
Semua contoh "" adalah string literal yang diinternir sama (atau seharusnya). Jadi Anda benar-benar tidak akan melemparkan objek baru di heap setiap kali Anda menggunakan "" tetapi hanya membuat referensi ke objek yang sama, diinternir. Karena itu, saya lebih suka string.Empty. Saya pikir itu membuat kode lebih mudah dibaca.
sumber
Itu tidak masalah!
Beberapa diskusi terakhir tentang ini:
http://www.codinghorror.com/blog/archives/000185.html
http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx
http://blogs.msdn.com/brada/archive/2003/04/27/50014.aspx
sumber
ldstr
mendorong referensi objek baru ke string literal yang disimpan dalam metadata.ldsfld
mendorong nilai bidang statis ke tumpukan evaluasiSaya cenderung menggunakan
String.Empty
bukan""
karena IMHO itu lebih jelas dan kurang VB-ish.sumber
Berikut adalah beberapa hasil Roslyn x64 per Januari 2019. Meskipun pernyataan konsensus dari jawaban lain di halaman ini, tampaknya bagi saya bahwa JIT x64 saat ini memperlakukan semua kasus ini secara identik, ketika semua dikatakan dan dilakukan.
Perhatikan secara khusus, bagaimanapun, bahwa hanya satu dari contoh ini yang benar-benar berakhir dengan panggilan
String.Concat
, dan saya menduga itu karena alasan kebenaran yang tidak jelas (sebagai lawan dari pengawasan optimasi). Perbedaan lain tampaknya lebih sulit untuk dijelaskan.default (String) + {default (String), "", String.Empty}
"" + {default (String), "", String.Empty}
String.Empty + {default (String), "", String.Empty}
Detail tes
sumber
Datang dari sudut pandang Entity Framework: EF versi 6.1.3 tampaknya memperlakukan String.Empty dan "" secara berbeda saat memvalidasi.
string.Empty diperlakukan sebagai nilai nol untuk keperluan validasi dan akan melempar kesalahan validasi jika digunakan pada bidang Diperlukan (dikaitkan); dimana "" akan melewati validasi dan tidak membuang kesalahan.
Masalah ini dapat diatasi dalam EF 7+. Referensi: - https://github.com/aspnet/EntityFramework/issues/2610 ).
Sunting: [Diperlukan (AllowEmptyStrings = true)] akan menyelesaikan masalah ini, memungkinkan string.Empty untuk memvalidasi.
sumber
Karena String.Empty bukan konstanta waktu kompilasi, Anda tidak dapat menggunakannya sebagai nilai default dalam definisi fungsi.
sumber
public void test(int i=0, string s=string.Empty) {}
tidak akan mengkompilasi dan mengatakan "Nilai parameter default untuk 's' harus berupa konstanta waktu kompilasi. Jawaban OP berfungsi.Saat Anda memindai kode secara visual, "" tampak berwarna seperti string yang diwarnai. string.Empty tampak seperti akses anggota kelas biasa. Selama tampilan cepat, lebih mudah menemukan "" atau intuisi maknanya.
Temukan string (stack overflow colorization tidak membantu, tetapi dalam VS ini lebih jelas):
sumber
\u00ad
.Semua orang di sini memberikan klarifikasi teoretis yang baik. Saya memiliki keraguan yang sama. Jadi saya mencoba coding dasar di atasnya. Dan saya menemukan perbedaan. Inilah bedanya.
Jadi sepertinya "Null" berarti benar-benar batal & "String.Empty" berarti Ini berisi semacam nilai, tetapi itu kosong.
sumber
""
versusstring.Empty
. Hanya ketika mencoba untuk mengetahui apakah string kosong,null
telah disebutkan.