VB.NET'te Döküm ve Veri Türü Dönüşümleri

Döküm süreç örneğin bir Tamsayı türünden bir Dize türüne başka bir veri türünü dönüştürme. Bazı işlemler VB.NET çalışmak için belirli veri türleri gerektirir. Döküm, ihtiyacınız olan türü oluşturur. Bu iki bölümlük dizinin ilk makalesi olan VB.NET'te Döküm ve Veri Türü Dönüşümleri dökümü tanıtıyor. Bu makalede, yayınlamak için kullanabileceğiniz üç işleç açıklanır VB.NET - DirectCast, CType ve TryCast - ve performanslarını karşılaştırır.

Performans, Microsoft ve diğer makalelere göre üç döküm operatörü arasındaki büyük farklardan biridir. Örneğin, Microsoft genellikle "DirectCast... CType'tan biraz daha iyi performans sağlayabilir veri türüne ve nesnesine dönüştürürken Nesne." (Vurgu eklendi.)

Kontrol etmek için bir kod yazmaya karar verdim.

Ama önce bir uyarı sözü. Dan Appleman, teknik kitap yayıncısı Apress'in kurucularından ve güvenilir bir teknik guru, bir keresinde bana kıyaslama performansının doğru şekilde yapılmasının çoğu insandan daha zor olduğunu söyledi biliyoruz. Makine performansı, paralel çalışan diğer işlemler, optimizasyon gibi faktörler vardır bellek önbellekleme veya derleyici optimizasyonu ve kodun gerçekte ne olduğu hakkındaki varsayımlarınızdaki hatalar gibi yapıyor. Bu kriterlerde, "elma ve portakal" karşılaştırma hatalarını ortadan kaldırmaya çalıştım ve tüm testler sürüm derlemesi ile gerçekleştirildi. Ancak yine de bu sonuçlarda hatalar olabilir. Herhangi bir fark ederseniz, lütfen bana bildirin.

instagram viewer

Üç döküm operatörü:

  • DirectCast
  • CType
  • TryCast

Pratikte, genellikle uygulamanızın gereksinimlerinin hangi operatörü kullandığınızı belirleyeceğini göreceksiniz. DirectCast ve TryCast çok dar gereksinimlere sahiptir. DirectCast kullandığınızda, türün zaten bilinmesi gerekir. Her ne kadar kod ...

theString = DirectCast (theObject, String)

... Nesne zaten bir dize değilse başarıyla derlenirse, kod bir çalışma zamanı istisnası atar.

TryCast daha da kısıtlayıcıdır çünkü Tamsayı gibi "değer" türlerinde hiç çalışmaz. (Dize bir referans türüdür. Değer türleri ve başvuru türleri hakkında daha fazla bilgi için bu serideki ilk makaleye bakın.) Bu kod ...

theInteger = TryCast (theObject, Integer)

... derlenmeyecek bile.

TryCast, ne tür bir nesne ile çalıştığınızdan emin değilseniz kullanışlıdır. DirectCast gibi bir hata atmak yerine, TryCast hiçbir şey döndürmez. Normal uygulama, TryCast'i çalıştırdıktan sonra Hiçbir şey test etmektir.

Yalnızca CType (ve CInt ve CBool ​​gibi diğer "Convert" işleçleri, Tamsayı gibi kalıtım ilişkisi olmayan türleri bir Dizeye dönüştürür:

TheString As String = "1" Integer'ı Tamsayı Olarak Karart. theInteger = CType (theString, Integer)

CType bu dönüşümleri gerçekleştirmek için .NET CLR (Ortak Dil Çalışma Zamanı) bir parçası olmayan "yardımcı işlevleri" kullandığından, bu çalışır.

Ancak, eğer bir Tamsayıya dönüştürülebilecek bir şey içermiyorsa CType'ın da bir istisna atacağını unutmayın. Dizenin böyle bir tamsayı olmaması olasılığı varsa ...


Dim theString As String = "George"

... hiçbir döküm operatörü çalışmaz. TryCast bile bir değer türü olduğu için Integer ile çalışmaz. Böyle bir durumda, verilerinizi yayınlamaya çalışmadan önce verilerinizi kontrol etmek için TypeOf operatörü gibi geçerlilik kontrolünü kullanmanız gerekir.

DirectCast için Microsoft'un belgeleri özellikle bir Nesne türü ile dökümden bahsediyor, bu yüzden ilk performans testimde kullandım. Test bir sonraki sayfada başlıyor!

DirectCast genellikle bir Nesne türü kullanır, bu yüzden ilk performans testimde kullandım. TryCast'i teste dahil etmek için, TryCast kullanan neredeyse tüm programların bir tane içereceği için bir If bloğu da ekledim. Ancak bu durumda, asla yürütülmeyecektir.

Bir Nesneyi Dizeye yayınlarken her üçünü de karşılaştıran kod:

Yeni Kronometre () Dizeyi Dize Dim. Dim theObject As Object = "Bir Nesne" Yinelemeleri Tamsayı Dim = CInt (Yinelemeler. Metin) * 1000000. ' 'DirectCast Testi. zaman. Başlat() İ = 0 için theString = DirectCast (theObject, String) Sonraki. zaman. Dur() DirectCastTime. Metin = zaman. ElapsedMilliseconds. ToString. ' 'CType Testi. zaman. Tekrar başlat() İ As için Tamsayı = 0 Hedeflere. theString = CType (theObject, String) Sonraki. zaman. Dur() CTypeTime. Metin = zaman. ElapsedMilliseconds. ToString. ' 'TryCast Testi. zaman. Tekrar başlat() İ As için Tamsayı = 0 Hedeflere. theString = TryCast (theObject, String) Eğer o zaman hiçbir şey yoksa. MsgBox ("Bu asla görüntülenmemelidir") End If. Sonraki. zaman. Dur() TryCastTime. Metin = zaman. ElapsedMilliseconds. ToString.

Bu ilk test, Microsoft'un doğru hedefte olduğunu gösteriyor. İşte sonuç. (Çok sayıda yinelemeyle yapılan deneyler ve farklı koşullar altında tekrarlanan testler bu sonuçtan önemli bir farklılık göstermedi.)


Resmi görüntülemek için Buraya tıklayın

DirectCast ve TryCast 323 ve 356 milisaniyede benzerdi, ancak CType 1018 milisaniyede üç kat daha fazla zaman aldı. Bunun gibi referans türlerini yayınlarken, CType'ın performans esnekliği için ödeme yaparsınız.

Ama her zaman bu şekilde çalışıyor mu? DirectCast için sayfalarındaki Microsoft örneği, temel olarak size alışkanlık DirectCast kullanarak çalışın, ne yapacaksınız. İşte Microsoft örneği:

Dim q Nesne Olarak = 2.37. Dim i As Tamsayı = CType (q, Tamsayı) 'Aşağıdaki dönüşüm çalışma zamanında başarısız olur. Dim j As Tamsayı = DirectCast (q, Tamsayı) Dim f Yeni Sistem Olarak. Pencereler. Formlar. Form. Dim c Sistem Olarak. Pencereler. Formlar. Kontrol. 'Aşağıdaki dönüşüm başarılı. c = DirectCast (f, Sistem. Pencereler. Formlar. Kontrol)

Başka bir deyişle, sen olamaz Nesne türünü bir Tamsayı türüne atamak için DirectCast (veya burada belirtilmemiş olsalar da TryCast) kullanın, ancak Yapabilmek Form türünü Denetim türüne atamak için DirectCast kullanın.

Microsoft'un neye ilişkin örneğinin performansını kontrol edelim niyet DirectCast ile çalışın. Yukarıda gösterilen aynı kod şablonunu kullanarak ...


c = DirectCast (f, Sistem. Pencereler. Formlar. Kontrol)

... CType ve TryCast için benzer ikamelerle birlikte koda girer. Sonuçlar biraz şaşırtıcı.


Resmi görüntülemek için Buraya tıklayın

DirectCast aslında 145 milisaniyede üç seçimin en yavaşıydı. CType 127 milisaniyede biraz daha hızlıdır, ancak If bloğu da dahil olmak üzere TryCast 77 milisaniyede en hızlısıdır. Ayrıca kendi nesnelerimi yazmaya çalıştım:


Sınıf ParentClass... Son Sınıf. Sınıf ChildClass. ParentClass'ı devralır... Son Sınıf. 

Benzer sonuçlar aldım. Görünüşe göre eğer değil Nesne türünü yayınladığınızda, daha iyi olursunuz değil DirectCast kullanarak.

instagram story viewer