ProgramlamaVB.NET geliştirici

Visual Basic'de tip dönüştürme (Type Conversion) nasıl gerçekleştirilir, CType, DirectCast ve TryCast arasındaki farklar nelerdir ve her birini ne zaman kullanmalıyız?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Kandırmaca soruları.

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.

Tipik hatalar ve anti-patternler

  • Yanlış tür dönüşümü InvalidCastException'a neden olur.
  • Dönüşümün mümkün olmaması durumunda işlenmesi gereken yerlerde TryCast kullanılır.
  • Uyumlu olmayan türlere dönüşüm için CType kullanılır.

Gerçek hayattan örnek

Olumsuz durum

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:

  • Basit ve evrensel.

Eksiler:

  • Çalışma zamanı hataları ve uygulamanın çökme olasılığı artar.

Olumlu durum

Ekip, referans yapılarına DirectCast, bilinmeyen nesnelerle çalışırken TryCast kullanır. TryCast için Nothing işlemesi eklenmiştir.

Artılar:

  • Güvenli kod kültürü, öngörülemeyen çökme yok.

Eksiler:

  • Farklı dönüşüm seçenekleri nedeniyle kodun okunabilirliği bazen zordur.