Dalam C #, saya ingin menginisialisasi nilai string dengan string kosong.
Bagaimana saya harus melakukan ini? Apa jalan yang benar, dan mengapa?
string willi = string.Empty;
atau
string willi = String.Empty;
atau
string willi = "";
atau apa?
c#
.net
string
initialization
Daniel Kreiseder
sumber
sumber
Jawaban:
Gunakan apa pun yang Anda dan tim Anda temukan yang paling mudah dibaca.
Jawaban lain menyarankan bahwa string baru dibuat setiap kali Anda menggunakan
""
. Ini tidak benar - karena pemagangan string, itu akan dibuat sekali per perakitan atau sekali per AppDomain (atau mungkin sekali untuk seluruh proses - tidak yakin di depan itu). Perbedaan ini dapat diabaikan - secara besar-besaran, tidak signifikan secara besar- besaran .Yang menurut Anda lebih mudah dibaca adalah masalah yang berbeda. Ini subjektif dan akan bervariasi dari orang ke orang - jadi saya sarankan Anda mencari tahu apa yang disukai kebanyakan orang di tim Anda, dan semuanya sesuai dengan konsistensi. Secara pribadi saya merasa
""
lebih mudah dibaca.Argumen itu
""
dan" "
mudah keliru satu sama lain tidak benar-benar cocok dengan saya. Kecuali Anda menggunakan font proporsional (dan saya belum pernah bekerja dengan pengembang mana pun ), cukup mudah untuk membedakannya.sumber
string.Empty
yang tidak jelas tidak konstan . Itu berarti bahwa dalam sejumlah kasus di mana konstanta waktu kompilasi diperlukan,string.Empty
bahkan tidak sah. Ini termasukcase ""
blok diswitch
pernyataan, nilai default parameter opsional , parameter dan properti dalam menerapkan atribut , dan banyak situasi lain (diserahkan kepada pembaca). Jadi mengingat itustring.Empty
tidak diperbolehkan dalam beberapa situasi umum, lebih baik menggunakan""
konvensi-mana saja.Tidak ada perbedaan dari sudut pandang kinerja dan kode yang dihasilkan. Dalam pengujian kinerja, mereka bolak-balik di antara yang satu lebih cepat vs yang lain, dan hanya dalam milidetik.
Dalam melihat kode di balik layar, Anda juga tidak melihat perbedaan. Satu-satunya perbedaan adalah pada IL, yang
string.Empty
menggunakan opcodeldsfld
dan""
menggunakan opcodeldstr
, tetapi itu hanya karenastring.Empty
statis, dan kedua instruksi melakukan hal yang sama. Jika Anda melihat perakitan yang diproduksi, itu persis sama.Kode C #
Kode IL
Kode perakitan
sumber
Kode terbaik adalah tidak ada kode sama sekali :
Akibatnya, kode kurang adalah kode yang lebih baik: Memilih untuk
""
kestring.Empty
atauString.Empty
. Keduanya enam kali lebih lama tanpa manfaat tambahan - tentu saja tidak ada kejelasan tambahan, karena mereka mengungkapkan informasi yang sama persis.sumber
i
adalah lebih baik daripada nama variabel yang panjang. Yang lebih umum, nama variabel pendek yang menyampaikan informasi yang sama , dalam kejelasan yang sama, selalu lebih disukai. Hanya saja untuk mengekspresikan informasi yang diperlukan Anda perlu panjang karakter tertentu, dan saya tidak menyangkal ini (tidak ada yang).Satu perbedaan adalah bahwa jika Anda menggunakan
switch-case
sintaks, Anda tidak dapat menuliscase string.Empty:
karena itu bukan konstanta. Anda mendapatkanCompilation error : A constant value is expected
Lihatlah tautan ini untuk info lebih lanjut: string-blank-versus-empty-quotes
sumber
switch
pernyataan adalah salah satu contoh yang sangat baik. Juga, jika Anda membuat parameter opsional, sepertivoid MyMethod(string optional = "") { ... }
, itu juga tidak mungkin digunakanstring.Empty
. Dan tentu saja jika Anda ingin mendefinisikanconst
bidang atau variabel lokal,const string myString = "";
lagi""
adalah satu-satunya pilihan. Jika hanyastring.Empty
bidang yang konstan, tidak akan ada perbedaan. Tapi tidak, jadi dalam beberapa kasus Anda harus menggunakan""
. Jadi mengapa tidak menggunakannya""
setiap saat?string.Empty
mencegah Anda mencapai konsistensi dalam basis kode Anda: Anda harus menggunakan dua entitas yang berbeda untuk mengekspresikan hal yang sama. Dan untuk menambah daftar hal-hal yang tidak dapat Anda lakukan: Anda tidak dapat menggunakanstring.Empty
dengan atribut .Saya lebih suka
string
untukString
. memilihstring.Empty
lebih""
adalah masalah memilih satu dan tetap menggunakannya. Keuntungan menggunakanstring.Empty
adalah sangat jelas apa yang Anda maksud, dan Anda tidak sengaja menyalin lebih dari karakter yang tidak dapat dicetak seperti"\x003"
di Anda""
.sumber
""
berbahaya ketika menyalin / menempel tidak sah, saya klaim, karena Anda tidak pernah menyalin / menempel string kosong. Untuk string lain, itu selalu sesuatu yang harus diperhatikan, tentu saja.Saya tidak akan berpadu, tapi saya melihat beberapa info yang salah dibuang di sini.
Saya pribadi lebih suka
string.Empty
. Itu adalah pilihan pribadi, dan saya tunduk pada kehendak tim apa pun yang bekerja sama dengan saya berdasarkan kasus per kasus.Seperti yang disebutkan beberapa orang lainnya, tidak ada perbedaan sama sekali antara
string.Empty
danString.Empty
.Selain itu, dan ini adalah fakta yang sedikit diketahui, menggunakan "" sangat bisa diterima. Setiap instance "" akan, di lingkungan lain, membuat objek. Namun, .NET magang string-nya, sehingga contoh di masa depan akan menarik string abadi yang sama dari kolam intern, dan setiap hit kinerja akan diabaikan. Sumber: Brad Abrams .
sumber
Saya pribadi lebih suka "" kecuali ada alasan bagus untuk sesuatu yang lebih kompleks.
sumber
String.Empty
danstring.Empty
setara.String
adalah nama kelas BCL;string
adalah alias C # (atau pintasan, jika Anda mau). Sama seperti denganInt32
danint
. Lihat dokumen untuk contoh lebih lanjut.Sejauh
""
menyangkut, saya tidak begitu yakin.Secara pribadi, saya selalu menggunakan
string.Empty
.sumber
Hampir setiap pengembang di luar sana akan tahu apa artinya "". Saya pribadi menjumpai String.Empty pertama kali dan harus meluangkan waktu mencari google untuk mengetahui apakah mereka benar - benar hal yang sama persis.
sumber
string.Empty
? Tahukah Anda apa""
yang pertama kali Anda lihat?Topik ini cukup lama dan panjang, jadi permisi jika perilaku ini disebutkan di tempat lain. (Dan arahkan saya ke jawaban yang mencakup ini)
Saya telah menemukan perbedaan dalam perilaku kompiler jika Anda menggunakan
string.Empty
atau mengutip ganda. Perbedaannya muncul dengan sendirinya jika Anda tidak menggunakan variabel string yang diinisialisasi dengan string.Empty atau dengan tanda kutip ganda.Dalam kasus inisialisasi dengan
string.Empty
maka Peringatan Kompilertidak pernah dipancarkan saat inisialisasi dengan tanda kutip ganda Anda mendapatkan pesan yang diharapkan.
Perilaku ini dijelaskan dalam artikel Hubungkan di tautan ini: https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value
Pada dasarnya, jika saya melakukannya dengan benar, mereka ingin memungkinkan seorang programmer untuk mengatur variabel dengan nilai kembali fungsi untuk keperluan debugging tanpa mengganggunya dengan pesan peringatan dan dengan demikian mereka membatasi peringatan hanya dalam hal penugasan dan string yang mahal. Kosong bukan konstanta tetapi bidang.
sumber
var unused = "literal";
dapat sepenuhnya dioptimalkan (dihapus) oleh kompiler. Tidak ada efek samping. Di sisi lain,var unused = MyClass.Member;
tidak bisa dihilangkan seluruhnya. Itu karena membacaMember
dapat memiliki efek samping. JikaMember
properti statis denganget
accessor, jelas bahwa panggilan ke pengambil harus dijaga. Tetapi bahkan jika ituMember
adalah bidang statis, mungkin ada efek samping bahwa konstruktor statis dapat berjalan. Tentu itu akan menjadi gaya pengkodean yang buruk untuk melakukannya dengan cara itu. Tetapi Anda perlu boneka untuk membacaMember
.Saya melakukan tes yang sangat sederhana ini menggunakan metode berikut dalam aplikasi konsol:
Ini jelas menunjukkan bahwa ketiga variabel yaitu
str1
,str2
danstr3
meskipun diinisialisasi menggunakan sintaks yang berbeda menunjuk ke objek string yang sama (panjang nol) di memori. Saya melakukan tes ini di aplikasi .NET 4.5 konsol. Jadi secara internal mereka tidak memiliki perbedaan dan semuanya bermuara pada kenyamanan yang mana yang ingin Anda gunakan sebagai programmer. Perilaku kelas string ini dikenal sebagai string magang di .NET. Eric Lippert memiliki blog yang sangat bagus di sini yang menggambarkan konsep ini.sumber
Salah satu di atas.
Ada banyak, banyak hal yang lebih baik untuk dikuasai. Seperti warna kulit pohon yang paling cocok untuk pohon, saya pikir cokelat samar dengan warna lumut belati.
sumber
Saya sangat suka String.Empty, selain dari alasan lain untuk memastikan Anda tahu apa itu dan bahwa Anda tidak sengaja menghapus konten, tetapi terutama untuk internasionalisasi. Jika saya melihat string dalam tanda kutip maka saya selalu bertanya-tanya apakah itu kode baru dan harus dimasukkan ke dalam tabel string. Jadi, setiap kali kode diubah / ditinjau, Anda perlu mencari "sesuatu dalam tanda kutip" dan ya Anda dapat menyaring string kosong tapi saya katakan pada orang-orang itu adalah praktik yang baik untuk tidak pernah meletakkan string dalam tanda kutip kecuali Anda tahu itu tidak akan terlokalisasi .
sumber
Tidak ada yang menyebutkan bahwa dalam VisualStudio String kode warna berbeda dari string. Yang penting untuk keterbacaan. Juga, huruf kecil biasanya digunakan untuk vars dan tipe, bukan masalah besar tapi String.Empty adalah konstanta dan bukan var atau tipe.
sumber
string
adalah sinonim untukSystem.String
tipe, Mereka identik.Nilai-nilai juga identik:
string.Empty == String.Empty == ""
Saya tidak akan menggunakan konstanta karakter "" dalam kode, lebih tepatnya
string.Empty
atauString.Empty
- lebih mudah untuk melihat apa yang dimaksud pemrogram.Antara
string
danString
saya suka huruf kecilstring
lebih hanya karena saya dulu bekerja dengan Delphi selama bertahun-tahun dan gaya Delphi adalah huruf kecilstring
.Jadi, jika saya adalah bos Anda, Anda akan menulis
string.Empty
sumber
Saya akan mendukung
string.Empty
lebihString.Empty
karena Anda dapat menggunakannya tanpa perlu menyertakanusing System;
dalam file Anda.Adapun memilih
""
lebihstring.Empty
, itu adalah pilihan pribadi dan harus diputuskan oleh tim Anda.sumber
string.Empty
konstanta tanpa mengimporusing System
namespace - Kata kunci dalam C # cukup dikonversi ke nama yang sepenuhnya memenuhi syarat yang mencakup namespace juga sebelum ditulis sebagai MSIL dalam output * .dll atau *. file exe. Jadi secara efektifstring.Empty
ditulis sepertiSystem.String.Empty
dalam MSIL oleh kompiler. Dan karena Anda mungkin sudah tahu bahwa jika Anda menyebutkan nama jenis yang memenuhi syarat maka Anda dapat memberikan lompatan untuk mengimpor ruang nama di bagian atas file kode Anda.Saya tidak membuat perbedaan. Yang terakhir adalah yang tercepat untuk mengetik :)
sumber
Tidak masalah - mereka persis hal yang sama. Namun, yang utama adalah Anda harus konsisten
id Saya berjuang dengan "whats the right thing" semacam ini sepanjang waktu.
sumber
Ini benar-benar preferensi gaya-kode, lakukan untuk bagaimana .NET menangani string. Namun, inilah pendapat saya :)
Saya selalu menggunakan nama Tipe BCL ketika mengakses metode statis, properti dan bidang:
String.Empty
atauInt32.TryParse(...)
atauDouble.Epsilon
Saya selalu menggunakan kata kunci C # ketika mendeklarasikan instance baru:
int i = 0;
ataustring foo = "bar";
Saya jarang menggunakan string string yang tidak dideklarasikan karena saya ingin dapat memindai kode untuk menggabungkannya menjadi konstanta bernama yang dapat digunakan kembali. Kompiler menggantikan konstanta dengan literal, jadi ini lebih merupakan cara untuk menghindari string / angka ajaib dan untuk memberi sedikit lebih banyak makna kepada mereka dengan nama. Ditambah mengubah nilai lebih mudah.
sumber
Saya menggunakan yang ketiga, tetapi dari dua lainnya yang pertama tampaknya kurang aneh. string adalah alias untuk String, tetapi melihatnya di suatu tugas terasa tidak menyenangkan.
sumber
Salah satu dari dua yang pertama akan diterima oleh saya. Saya akan menghindari yang terakhir karena relatif mudah untuk memperkenalkan bug dengan memberi jarak di antara tanda kutip. Bug khusus ini akan sulit ditemukan dengan observasi. Dengan asumsi tidak ada kesalahan ketik, semua secara semantik setara.
[EDIT]
Juga, Anda mungkin ingin selalu menggunakan salah satu
string
atauString
untuk konsistensi, tapi itu hanya saya.sumber
Saya pribadi menyaksikan "" mengakibatkan masalah (minor) dua kali. Pernah karena kesalahan pengembang junior yang baru pemrograman berbasis tim, dan yang lainnya adalah kesalahan ketik yang sederhana, tetapi kenyataannya menggunakan string. Kekuasaan akan menghindari kedua masalah.
Ya, ini adalah panggilan penilaian, tetapi ketika sebuah bahasa memberi Anda banyak cara untuk melakukan sesuatu, saya cenderung condong ke arah yang memiliki pengawasan paling kompiler dan penegakan waktu kompilasi terkuat. Itu bukan "". Ini semua tentang mengekspresikan maksud tertentu.
Jika Anda mengetik string.EMpty atau Strng.Empty, kompiler memberi tahu Anda bahwa Anda melakukan kesalahan. Segera. Itu tidak akan dikompilasi. Sebagai pengembang, Anda mengutip maksud tertentu yang tidak dapat disalahartikan oleh kompiler (atau pengembang lain), dan ketika Anda melakukannya dengan salah, Anda tidak dapat membuat bug.
Jika Anda mengetikkan "" ketika maksud Anda "" atau sebaliknya, kompiler dengan senang hati melakukan apa yang Anda perintahkan. Pengembang lain mungkin atau mungkin tidak dapat mengumpulkan maksud spesifik Anda. Bug dibuat.
Jauh sebelum string.Empty adalah hal yang saya gunakan perpustakaan standar yang mendefinisikan konstanta EMPTY_STRING. Kami masih menggunakan konstanta itu dalam pernyataan kasus di mana string.Empty tidak diizinkan.
Kapan pun memungkinkan, letakkan kompiler berfungsi untuk Anda, dan hilangkan kemungkinan kesalahan manusia, sekecil apa pun. IMO, ini mengalahkan "keterbacaan" seperti yang dikutip orang lain.
Kekhususan dan kompilasi penegakan waktu. Ini untuk makan malam.
sumber
Saya menggunakan "" karena akan diberi warna kuning khas dalam kode saya ... untuk beberapa alasan String.Empty semuanya putih dalam tema Visual Studio Code saya. Dan saya percaya itu yang terpenting bagi saya.
sumber
Kompiler harus membuat semuanya tetap sama dalam jangka panjang. Pilih standar sehingga kode Anda akan mudah dibaca, dan tetap menggunakannya.
sumber
Saya hanya melihat beberapa kode dan pertanyaan ini muncul di pikiran saya yang telah saya baca beberapa waktu sebelumnya. Ini tentu saja masalah keterbacaan.
Pertimbangkan kode C # berikut ...
vs.
Saya pribadi menemukan yang terakhir kurang ambigu dan lebih mudah dibaca.
Seperti yang ditunjukkan oleh orang lain, perbedaan yang sebenarnya dapat diabaikan.
sumber
Saya pikir yang kedua adalah "tepat," tetapi jujur saja, saya pikir itu tidak masalah. Kompiler harus cukup pintar untuk mengkompilasi semua dari mereka ke bytecode yang sama persis. Saya menggunakan "" diri saya sendiri.
sumber
Walaupun perbedaannya sangat, SANGAT kecil, perbedaannya masih ada.
1) "" membuat objek sedangkan String.Empty tidak. Tetapi objek ini akan dibuat sekali dan akan direferensikan dari kumpulan string nanti jika Anda memiliki "" yang lain dalam kode.
2) String dan string adalah sama, tetapi saya akan merekomendasikan untuk menggunakan String.Empty (serta String.Format, String.Copy dll) karena notasi titik menunjukkan kelas, bukan operator, dan memiliki kelas yang dimulai dengan huruf kapital sesuai dengan Standar pengkodean C #.
sumber
Pada http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx :
sumber
String kosong seperti set kosong hanya nama yang digunakan semua orang untuk memanggil
""
. Juga dalam bahasa formal string yang dibuat dari alfabet yang memiliki panjang nol disebut string kosong. Baik set maupun string memiliki simbol khusus untuk itu. String kosong: ε dan set kosong: ∅. Jika Anda ingin berbicara tentang string panjang nol ini, Anda akan menyebutnya string kosong sehingga semua orang tahu persis apa yang Anda maksud. Sekarang dalam kasus Anda beri nama string kosong mengapa tidak digunakanstring.Empty
dalam kode, ini menunjukkan maksudnya eksplisit. Kelemahannya adalah itu tidak konstan dan karenanya tidak tersedia di mana-mana, seperti pada atribut. (Ini bukan konstanta untuk beberapa alasan teknis, lihat sumber referensi.)sumber
Saya lebih suka
""
karena lebih pendek danString.Empty
menyelesaikan masalah yang tidak ada.sumber