Bagaimana saya harus menggunakan VB.NET?

151

Apakah semua ini sama? Dalam keadaan apa saya harus memilih masing-masing dari yang lain?

  • var.ToString ()

  • CStr (var)

  • CType (var, String)

  • DirectCast (var, String)


EDIT: Saran dari NotMyself ...

  • TryCast (var, String)
Zack Peterson
sumber

Jawaban:

156

Itu semua sedikit berbeda, dan umumnya memiliki penggunaan yang dapat diterima.

  • var.ToString()akan memberi Anda representasi string dari suatu objek, apa pun jenisnya. Gunakan ini jika varbelum memiliki string.
  • CStr(var)adalah operator cor string VB. Saya bukan orang VB, jadi saya sarankan menghindarinya, tapi itu tidak benar-benar akan menyakiti apa pun. Saya pikir pada dasarnya sama dengan CType.
  • CType(var, String) akan mengkonversi tipe yang diberikan ke string, menggunakan operator konversi yang disediakan.
  • DirectCast(var, String)digunakan untuk melemparkan objek ke dalam string. Jika Anda tahu bahwa variabel objek sebenarnya adalah string, gunakan ini. Ini sama dengan (string)vardi C #.
  • TryCast(seperti yang disebutkan oleh @ NotMyself ) seperti DirectCast, tetapi akan kembali Nothingjika variabel tidak dapat dikonversi menjadi string, daripada melempar pengecualian. Ini sama dengan var as stringdi C #. The TryCasthalaman di MSDN memiliki perbandingan yang baik, juga.
bdukes
sumber
15
Tidak pernah ada alasan untuk menggunakan CType (var, String) daripada CStr (var), mereka melakukan hal yang persis sama.
Jonathan Allen
2
@Maslow TryCasthanya berfungsi untuk tipe nilai, karena harus tipe yang dapat memiliki Nothingnilai
bdukes
1
@ Martinho benar. Yang seharusnya mengatakan "hanya bekerja untuk tipe referensi "
bdukes
3
CStr(var)akan tersedak dan memunculkan eksepsi jika var adalah DBNull.Value, tetapi alternatif Convert.ToString(var)akan mengembalikan string kosong.
MCattle
Dim myList AS ArrayList=new ArrayListKetika Anda menulis (From e In myList select CType(e.Name,String)).ToArray()itu tidak berhasil. Saya datang untuk menulis ... select CType(e.Name.ToString,String)).ToArray()dan mengambil senyum saya.
Bellash
13

Cstr() dikompilasi secara inline untuk kinerja yang lebih baik.

CType memungkinkan untuk gips antar jenis jika operator konversi ditentukan

ToString() Antara tipe dasar dan string melempar pengecualian jika konversi tidak dimungkinkan.

TryParse()Dari String ke base typeifmungkin jika tidak, mengembalikan false

DirectCastdigunakan jika jenis terkait melalui pewarisan atau berbagi antarmuka umum, akan mengeluarkan pengecualian jika pemeran tidak dimungkinkan, tidak trycastakan mengembalikan apa pun dalam contoh ini

Siddharth Rout
sumber
8

MSDN tampaknya menunjukkan bahwa gips Cxxx untuk tipe tertentu dapat meningkatkan kinerja dalam VB. NET karena mereka dikonversi ke kode inline. Untuk beberapa alasan, ini juga menyarankan DirectCast sebagai lawan dari CType dalam kasus-kasus tertentu (dokumentasi menyatakan itu ketika ada hubungan warisan; Saya percaya ini berarti kewarasan para pemain diperiksa pada waktu kompilasi dan optimisasi dapat diterapkan sedangkan CType selalu menggunakan Runtime VB.)

Ketika saya sedang menulis kode VB .NET, apa yang saya gunakan tergantung pada apa yang saya lakukan. Jika itu adalah kode prototipe yang akan saya buang, saya menggunakan apa pun yang saya ketik. Jika itu kode yang saya seriuskan, saya mencoba menggunakan para pemain Cxxx. Jika tidak ada, saya menggunakan DirectCast jika saya memiliki keyakinan yang masuk akal bahwa ada hubungan warisan. Jika ini adalah situasi di mana saya tidak tahu jika para pemain harus berhasil (input pengguna -> integer, misalnya), maka saya menggunakan TryCast untuk melakukan sesuatu yang lebih ramah daripada melemparkan pengecualian pada pengguna.

Satu hal yang saya tidak bisa goyangkan adalah saya cenderung menggunakan ToString daripada CStr tetapi seharusnya Cstr lebih cepat.

OwenP
sumber
8

Saya lebih suka sintaks berikut:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

Hah Anda bisa tahu saya biasanya menulis kode dalam C #. 8)

Alasan saya lebih suka TryCast adalah Anda tidak perlu mengacaukan overhead pengecoran pengecualian. Pemain Anda berhasil atau variabel Anda diinisialisasi ke nol dan Anda mengatasinya.

Bukan dirimu sendiri
sumber
2
Saya pikir kamu salah. sama sekali bukan ide yang baik untuk menggunakan TryCast. dalam kasus seperti milik Anda, number.ToString () atau CStr (number) harus digunakan.
Shimmy Weitzhandler
4
@ Shimmy: Apa alasan di balik tidak menggunakan TryCast sama sekali? Bukankah DirectCast lebih baik menghindari pengecualian dalam skenario tertentu?
Dienekes
3
@Dienekes dan NotMyself. TryCast hanya untuk tipe REFERENSI. Di sini, kami memiliki Integer, yang merupakan tipe VALUE. Compiler akan menolak TryCast. Juga, tujuannya adalah sebuah String. Entitas .Net apa pun kecuali Tidak ada yang mendukung .ToString(). Tipe nilai, seperti Integer, tidak bisa apa-apa. Jadi dalam hal ini, CStr (angka) atau angka. ToString () aman. Dalam kasus umum (bukan hanya tipe nilai), CStr (apa pun) aman, karena dapat menangani Tidak Ada - hasilnya adalah Tidak ada, dalam variabel String. TryCast sangat berguna - tidak di sini.
ToolmakerSteve
4

Pengguna Konrad Rudolph mengadvokasi untuk DirectCast () di pertanyaan Stack Overflow "Fitur Tersembunyi VB.NET" .

Zack Peterson
sumber
-1 karena DirectCast secara BUKAN sesuai di sini, kecuali dalam situasi yang sangat terbatas, yang tidak perlu Anda sebutkan. DirectCast bagus ketika Anda tahu Anda memiliki dua JENIS REFERENSI TERKAIT, dan menginginkan casting yang efisien di antara mereka. Karena pertanyaannya adalah tentang mendapatkan a String, OP tidak mungkin mendiskusikan situasi di mana DirectCast sesuai.
ToolmakerSteve
... Jika pertanyaannya tidak disebutkan Stringdan ToString, keluhan saya tidak akan berlaku. Anda tidak harus mengadvokasi DirectCast, sampai Anda telah mempersempit topik dari Konversi umum.
ToolmakerSteve
1

Menurut ujian sertifikasi, Anda harus menggunakan Convert.ToXXX () bila memungkinkan untuk konversi sederhana karena mengoptimalkan kinerja lebih baik daripada konversi CXXX.

SickPuP
sumber
1
FYI, Menurut Paul Vick di Microsoft, operator Cxxx lebih cepat daripada fungsi Convert.Toxxx, setidaknya pada tahun 2004, karena Cxxx mengkompilasi langsung ke IL, daripada memanggil fungsi. Meskipun alasannya tampaknya meragukan, mengingat kemampuan untuk mengoptimalkan panggilan fungsi JIT. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve
0

Pada suatu waktu, saya ingat melihat keadaan perpustakaan MSDN untuk menggunakan CStr () karena lebih cepat. Saya tidak tahu apakah ini benar.

joek1975
sumber
2
DirectCast lebih cepat dari CStr, tetapi Anda hanya bisa menggunakannya saat memasukkan objek string ke dalam variabel string. Ini akan gagal jika Anda mencoba mengubah objek lain menjadi string.
Jonathan Allen