Visual Basic'te tip dönüşümü sorunu dilin ilk sürümlerinden itibaren ortaya çıkmıştır ve sıkı tip kontrolü ve .NET'teki çoklu sınıf hiyerarşilerinin ortaya çıkmasıyla daha da önemli hale gelmiştir.
Temel görev, çalışma zamanı hatalarını göz önünde bulundurarak uyumlu veri türleri arasında güvenli ve açık bir dönüşüm sağlamaktır.
Çözüm – VB.NET'te dönüşüm için anahtar operatörler bulunmaktadır: CType, DirectCast, TryCast.
CType, uyumlu herhangi iki tür arasında dönüşüm gerçekleştirir ve IConvertible arayüzünün uygulanmasını çağırabilir.DirectCast, yalnızca sınıf hiyerarşisinde türlerin uyumunu sıkı bir şekilde talep eder, tür dönüşümü gerçekleştirmez, sadece referansa dönüşüm yapar.TryCast, dönüşüm mümkün değilse Nothing döndürür, istisna oluşturmaz (yalnızca referans türleri için geçerlidir).Kod örneği:
Class Animal : End Class Class Dog Inherits Animal End Class Dim a As Animal = New Dog() Dim d1 As Dog = CType(a, Dog) Dim d2 As Dog = DirectCast(a, Dog) Dim d3 As Dog = TryCast(a, Dog) ' d3 — Dog nesnesi veya Nothing
Ana özellikler:
CType en çok yönlüdür, ancak dönüşüm mümkün değilse istisna fırlatabilir.DirectCast yalnızca referansların sıkı tür eşlemesini takip eder.TryCast istisna oluşturmaz, sadece Nothing döndürür.TryCast, değer türleri (Value Types) için kullanılabilir mi?
Hayır, TryCast yalnızca referans türleri için geçerlidir. Bir yapı için kullanılmaya çalışılması durumunda derleme hatası oluşur.
CInt(obj) ile CType(obj, Integer) arasındaki fark nedir?
Benzerler, ikisi de obj'yi Integer'a dönüştürmeye çalışır. Ancak CInt, dize formatı tanımında daha katıdır ve açık dönüşümler mevcutsa CType'i kullanmak tercih edilmelidir.
Hangi durumda DirectCast kullanmak daha iyidir, CType'den ziyade?
Nesnelerin bir miras ilişkisi içinde olduğu veya bir arayüzü gerçekleştirdiği biliniyorsa ve kullanıcı tanımlı bir tür dönüşümü yapmaya gerek yoksa DirectCast kullanmak daha iyidir. DirectCast daha verimlidir çünkü dönüşüm mantığını çağırmaz.
Projede her zaman herhangi bir dönüşüm için CType kullanılıyor, sonuç olarak bazen türler uyumlu olmadığında işlenmemiş istisnalar meydana geliyor.
Artılar:
Eksiler:
Ekip, referans yapılarına DirectCast, bilinmeyen nesnelerle çalışırken TryCast kullanır. TryCast için Nothing işlemesi eklenmiştir.
Artılar:
Eksiler: