Casting dan Konversi Jenis Data di VB.NET

Casting adalah proses mengkonversi satu tipe data ke yang lain, misalnya, dari tipe Integer ke tipe String. Beberapa operasi di VB.NET membutuhkan tipe data tertentu untuk berfungsi. Casting menciptakan tipe yang Anda butuhkan. Artikel pertama dalam seri dua bagian ini, Casting dan Konversi Tipe Data di VB.NET, memperkenalkan casting. Artikel ini menjelaskan tiga operator yang dapat Anda gunakan untuk melakukan cast VB.NET - DirectCast, CType, dan TryCast - dan membandingkan kinerjanya.

Kinerja adalah salah satu perbedaan besar antara tiga operator casting menurut Microsoft dan artikel lainnya. Sebagai contoh, Microsoft biasanya berhati-hati untuk memperingatkan bahwa, "DirectCast... dapat memberikan kinerja yang agak lebih baik daripada CType saat mengkonversi ke dan dari objek tipe data. "(Penekanan ditambahkan.)

Saya memutuskan untuk menulis beberapa kode untuk diperiksa.

Tapi pertama-tama kata hati-hati. Dan Appleman, salah satu pendiri penerbit buku teknis Apress dan teknis yang andal guru, pernah mengatakan kepada saya bahwa kinerja benchmark jauh lebih sulit untuk dilakukan dengan benar daripada kebanyakan orang menyadari. Ada faktor-faktor seperti kinerja alat berat, proses lain yang mungkin berjalan secara paralel, optimisasi seperti memori caching atau optimisasi kompiler, dan kesalahan dalam asumsi Anda tentang apa kode sebenarnya perbuatan. Dalam tolok ukur ini, saya telah mencoba untuk menghilangkan kesalahan perbandingan "apel dan jeruk" dan semua tes telah dijalankan dengan rilis rilis. Tetapi mungkin masih ada kesalahan dalam hasil ini. Jika Anda perhatikan, beri tahu saya.

instagram viewer

Tiga operator casting adalah:

  • DirectCast
  • CType
  • TryCast

Pada kenyataannya, Anda biasanya akan menemukan bahwa persyaratan aplikasi Anda akan menentukan operator mana yang Anda gunakan. DirectCast dan TryCast memiliki persyaratan yang sangat sempit. Saat Anda menggunakan DirectCast, jenisnya harus sudah diketahui. Meskipun kodenya ...

theString = DirectCast (theObject, String)

... akan berhasil dikompilasi jika objek sudah bukan string, maka kode akan melempar pengecualian runtime.

TryCast bahkan lebih ketat karena tidak akan berfungsi sama sekali pada tipe "nilai" seperti Integer. (String adalah tipe referensi. Untuk lebih lanjut tentang tipe nilai dan tipe referensi, lihat artikel pertama dalam seri ini.) Kode ini ...

theInteger = TryCast (theObject, Integer)

... bahkan tidak bisa dikompilasi.

TryCast berguna ketika Anda tidak yakin jenis objek apa yang sedang Anda kerjakan. Alih-alih melempar kesalahan seperti DirectCast, TryCast hanya mengembalikan Nothing. Latihan normal adalah untuk menguji Tidak ada setelah menjalankan TryCast.

Hanya CType (dan operator "Konversi" lainnya seperti CInt dan CBool) yang akan mengonversi tipe yang tidak memiliki hubungan pewarisan seperti Integer ke String:

Dim theString As String = "1" Dim theInteger As Integer. theInteger = CType (theString, Integer)

Ini berfungsi karena CType menggunakan "fungsi pembantu" yang bukan bagian dari .NET CLR (Common Language Runtime) untuk melakukan konversi ini.

Tapi ingat bahwa CType juga akan melempar pengecualian jika Strtring tidak mengandung sesuatu yang dapat dikonversi ke Integer. Jika ada kemungkinan bahwa string tersebut bukan bilangan bulat seperti ini ...


Dim theString As String = "George"

... maka tidak ada operator casting yang akan bekerja. Bahkan TryCast tidak akan berfungsi dengan Integer karena ini adalah tipe nilai. Dalam kasus seperti ini, Anda harus menggunakan pengecekan validitas, seperti operator TypeOf, untuk memeriksa data Anda sebelum mencoba mengirimkannya.

Dokumentasi Microsoft untuk DirectCast secara khusus menyebutkan casting dengan tipe Object sehingga itulah yang saya gunakan dalam tes kinerja pertama saya. Pengujian dimulai pada halaman berikutnya!

DirectCast biasanya akan menggunakan tipe Object, jadi itulah yang saya gunakan dalam tes kinerja pertama saya. Untuk menyertakan TryCast dalam pengujian, saya juga menyertakan blok If karena hampir semua program yang menggunakan TryCast akan memilikinya. Dalam hal ini, bagaimanapun, itu tidak akan pernah dieksekusi.

Berikut kode yang membandingkan ketiganya saat melemparkan Obyek ke String:

Dim theTime As Stopwatch Baru () Dim theString As String. Dim theObject As Object = "An Object" Dim theIterations As Integer = CInt (Iterasi. Teks) * 1000000. ' 'Tes DirectCast. waktu. Mulailah() For i = 0 To theIterations. theString = DirectCast (theObject, String) Lanjut. waktu. Berhenti() DirectCastTime. Teks = waktu. Milis Sudah Berlalu. ToString. ' 'Tes CType. waktu. Mengulang kembali() For i As Integer = 0 To theIterations. theString = CType (theObject, String) Lanjut. waktu. Berhenti() CTypeTime. Teks = waktu. Milis Sudah Berlalu. ToString. ' 'Tes TryCast. waktu. Mengulang kembali() For i As Integer = 0 To theIterations. theString = TryCast (theObject, String) Jika the String Is nothing Then. MsgBox ("Ini seharusnya tidak pernah ditampilkan") Berakhir jika. Lanjut. waktu. Berhenti() TryCastTime. Teks = waktu. Milis Sudah Berlalu. ToString.

Tes awal ini tampaknya menunjukkan bahwa Microsoft tepat sasaran. Inilah hasilnya. (Eksperimen dengan jumlah iterasi yang lebih besar dan lebih kecil serta pengujian berulang dalam kondisi yang berbeda tidak menunjukkan perbedaan yang signifikan dari hasil ini.)


Klik di sini untuk menampilkan ilustrasi

DirectCast dan TryCast serupa pada 323 dan 356 milidetik, tetapi CType mengambil waktu tiga kali lebih banyak pada 1018 milidetik. Saat memasang jenis referensi seperti ini, Anda membayar fleksibilitas CType dalam kinerja.

Tetapi apakah selalu bekerja seperti ini? Contoh Microsoft di halaman mereka untuk DirectCast terutama berguna untuk memberi tahu Anda apa biasa bekerja menggunakan DirectCast, bukan apa yang akan. Inilah contoh Microsoft:

Dim q As Object = 2.37. Dim i As Integer = CType (q, Integer) 'Konversi berikut gagal pada waktu berjalan. Dim j As Integer = DirectCast (q, Integer) Dim f Sebagai Sistem Baru. Windows. Formulir. Bentuk. Dim c Sebagai Sistem. Windows. Formulir. Kontrol. 'Konversi berikut berhasil. c = DirectCast (f, Sistem. Windows. Formulir. Kontrol)

Dengan kata lain, kamu tidak bisa menggunakan DirectCast (atau TryCast, meskipun mereka tidak menyebutkannya di sini) untuk melemparkan tipe Objek ke tipe Integer, tetapi Anda bisa gunakan DirectCast untuk melemparkan tipe formulir ke tipe kontrol.

Mari kita periksa contoh kinerja apa dari Microsoft akan bekerja dengan DirectCast. Menggunakan templat kode yang sama seperti yang ditunjukkan di atas, gantikan ...


c = DirectCast (f, Sistem. Windows. Formulir. Kontrol)

... ke dalam kode bersama dengan substitusi serupa untuk CType dan TryCast. Hasilnya sedikit mengejutkan.


Klik di sini untuk menampilkan ilustrasi

DirectCast sebenarnya adalah yang paling lambat dari tiga pilihan pada 145 milidetik. CType hanya sedikit lebih cepat pada 127 milidetik tetapi TryCast, termasuk blok If, adalah yang tercepat di 77 milidetik. Saya juga mencoba menulis objek saya sendiri:


Kelas ParentClass... Kelas Akhir. Kelas Anak Kelas. Mewarisi ParentClass... Kelas Akhir. 

Saya mendapat hasil yang serupa. Tampaknya jika Anda tidak casting tipe objek, Anda lebih baik tidak menggunakan DirectCast.