Mengapa menggunakan string.Empty lebih dari "" saat menetapkan ke objek string


13

Saya telah menjalankan StyleCop di atas kode saya dan salah satu rekomendasi SA1122 adalah menggunakan string.Empty daripada "" saat menetapkan string kosong ke suatu nilai.

Pertanyaan saya adalah mengapa ini dianggap praktik terbaik. Atau, apakah ini dianggap praktik terbaik? Saya berasumsi tidak ada perbedaan kompiler antara dua pernyataan jadi saya hanya bisa berpikir bahwa itu adalah hal yang mudah dibaca?

JADI pertanyaan dan jawaban

Jon Skeet menjawab pertanyaan


5
Saya yakin ini ditanyakan dan dijawab di Stack Overflow - tapi saya kesulitan menemukannya. Ini berkaitan dengan fakta bahwa ia harus membuat instance objek string baru untuk ""tetapi tidakstring.Empty
ChrisF

@ ChrisF Ahh, tidak berpikir untuk melihat stack overflow untuk jenis pertanyaan ini. Saya akan melihat sebentar.
dreza

1
dupkan pertanyaan tentang stackoverflow: stackoverflow.com/questions/151472/…
quentin-starin

@ ChrisF - Telah diminta pada SO. Lebih dan lebih dan lebih ...
Oded

1
Di sini kita pergi - stackoverflow.com/questions/151472/... - kembali dari September 2008.
ChrisF

Jawaban:


12

Salah satu alasan yang valid adalah bahwa ini menjelaskan bahwa ini bukan kesalahan ketik atau pengganti, bahwa Anda benar-benar bermaksud menggunakan string kosong di sini.

Saya tidak tahu apakah itu dianggap "praktik terbaik".


7

Saya membayangkan ada dua alasan, satu untuk keterbacaan, dan dua untuk peningkatan kinerja kecil.

Keterbacaan itu mudah: jauh lebih cepat dikenali string.Emptydaripada "". Mencari string.Emptyjuga umumnya akan lebih mudah dan mungkin lebih akurat daripada mencari yang literal. Ini juga menjelaskan maksud: Anda tidak hanya membuat kesalahan ketik atau lupa untuk menyelesaikan sesuatu, Anda benar-benar ingin string kosong.

Alasan kinerja adalah karena magang . Anda lihat, runtime menyimpan tabel string yang sebelumnya digunakan sehingga dapat dengan cepat melakukan perbandingan string tanpa benar-benar melakukan pemeriksaan karakter-per-karakter. string.Emptysudah menjadi referensi diinternir ke ""mana-seperti mengetik literal mungkin tidak memberi Anda versi diinternir, sehingga menyebabkan sedikit kinerja hit.


7
satu nitpick, mengetikkan huruf "" literal akan selalu memberi Anda versi "" yang diinternir yang sama, setidaknya sejak .Net 2 dan yang lebih tinggi.
quentin-starin

Benar, artikel magang di MSDN agak sulit untuk diikuti pada titik itu. Tampaknya "" dan string.Empty harus keduanya menunjuk pada string yang diinternir yang sama, tetapi tampaknya menunjukkan beberapa perbedaan antara versi .net runtime. Saya pikir string literal apa pun yang muncul beberapa kali dalam kode akan diinternir pada penggunaan kedua dan selanjutnya, ya?
CodexArcanum

4
Juga saya harus menekankan bahwa ketika saya mengatakan sedikit, maksud saya sangat kecil. "Karena kinerja" bukan alasan untuk beralih dari satu representasi ke yang lain, itu hanya hal yang rapi yang perlu diketahui tentang runtime.
CodexArcanum

4
Perlu juga dicatat bahwa aspek kinerja hanya berlaku untuk kompilasi. Karena keduanya mengkompilasi ke IL yang sama, kinerja runtime harus identik.
lzcd

bahwa peningkatan kinerja hanya akan berada di compile
ratchet freak

4

string.Empty menang dalam kasus yang benar-benar sudut, yang dapat menyebabkan beberapa bug ajaib dan sangat sulit untuk di-debug:

Jika ada ruang lebar nol di "".


0

Menurut beberapa dokumentasi yang saya temukan, itu ada hubungannya dengan apa yang dipancarkan oleh kompiler.

Pencarian cepat mengungkapkan: http://stylecop.soyuz5.com/SA1122.html

Mengapa itu diajukan di bawah "Aturan Keterbacaan" dengan uraian itu membingungkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.