Saya seorang programmer C / C ++ / C # berpengalaman yang baru saja masuk ke VB.NET. Saya biasanya menggunakan CType (dan CInt, CBool, CStr) untuk cast karena karakternya lebih sedikit dan merupakan cara casting pertama yang saya alami, tetapi saya juga mengetahui DirectCast dan TryCast.
Sederhananya, apakah ada perbedaan (efek pemeran, kinerja, dll.) Antara DirectCast dan CType? Saya memahami ide TryCast.
vb.net
ctype
directcast
Caleb Hearth
sumber
sumber
Jawaban:
Hal pertama yang perlu diperhatikan adalah VB.NET tidak memiliki analog langsung ke
(type)instance
mekanisme casting C # . Saya mengemukakan ini karena berguna sebagai titik awal dalam membandingkan dua operator VB.NET (dan mereka adalah operator, bukan fungsi, meskipun mereka memiliki semantik fungsi).DirectCast()
lebih ketat daripada operator casting C #. Ini hanya memungkinkan Anda untuk melakukan cast ketika item yang sedang ditransmisikan adalah jenis yang Anda transmisikan. Saya yakin ini akan tetap membuka kotak jenis nilai, tetapi sebaliknya tidak akan melakukan konversi apa pun. Jadi, misalnya, Anda tidak dapat melakukan cast darishort
keint
, seperti yang dapat Anda lakukan dengan(int)
cast C # . Tapi Anda bisa mentransmisikan dari sebuahIEnumerable
ke sebuah array, jikaIEnumerable
variabel objek Anda benar-benar adalah sebuahArray
. Dan tentu saja Anda dapat melakukan cast dariObject
ke apa pun, dengan asumsi jenis instance objek Anda benar-benar berada di bawah jenis cast Anda di pohon warisan.Ini diinginkan karena jauh lebih cepat . Ada lebih sedikit konversi dan pemeriksaan jenis yang perlu dilakukan.
CType()
tidak seketat operator casting C #. Ini akan melakukan hal-hal yang tidak dapat Anda lakukan dengan(int)
cast bergaya sederhana , seperti mengubah string menjadi integer. Ini memiliki kekuatan yang sama dengan memanggilConvert.To___()
di C #, di mana___
tipe target pemain Anda.Ini diinginkan karena sangat kuat. Namun, kekuatan ini datang dengan mengorbankan kinerja; itu tidak secepat
DirectCast()
atau operator cor C # karena mungkin perlu melakukan banyak pekerjaan untuk menyelesaikan pemeran. Umumnya Anda harus memilihDirectCast()
saat Anda bisa.Akhirnya, Anda melewatkan satu operator casting:,
TryCast()
yang merupakan analog langsung keas
operator C # .sumber
DirectCast
adalah keuntungan lain. Jika Anda membuat kesalahan, compiler akan segera memberi tahu Anda, tetapi denganCType
kesalahan mungkin saja menyebabkan perilaku yang salah pada waktu proses - mungkin pada beberapa mesin pengguna dengan pengaturan regional yang berbeda.DirectCast
,TryCast
,CType
/Convert.ToXYZ()
,C<xyz>()
akan benar?DirectCast
hanya ketat untuk kelas, bukan antarmuka (karena Anda dapat memiliki jenis COM - dan mungkin yang lain - yang benar-benar mengimplementasikan antarmuka yang tidak ditentukan oleh daftar Jenis .NET.GetInterfaces
).TryCast()
danas
tidak persis sama.TryCast()
hanya bekerja dengan tipe referensi, sementaraas
bekerja dengan apapun yang bisa nol. Jadiint? icast = myNum as int?;
akan bekerja dengan baik, tetapiDim icast as Integer? = TryCast(myNum, Integer?)
akan memberikan kesalahan kompiler. Hanya satu lagi perbedaan aneh antara kedua bahasa tersebut. lolDengan
CType
Anda dapat menulis sesuatu seperti iniCtype("string",Integer)
. Tetapi denganDirectCast
pernyataan di atas akan memberikan kesalahan waktu kompilasi.sumber
DirectCast
lebih ketat daripadaCType
.Misalnya, ini akan memunculkan kesalahan:
Ini juga akan ditampilkan di Visual Studio IDE.
Namun, ini tidak menimbulkan kesalahan:
sumber