C# Dilinde Tip Dönüşümleri

Bu yazıda implicit ve explicit anahtar sözcüğü ile tip dönüşümlerini nasıl yapabileceğimize değineceğiz.

Photo by Suzanne D. Williams on Unsplash

C# dili strongly typed yapıdaki programlama dillerinden biridir. Yani bir objeyi farklı tipten ürettiğimiz bir objeye atamak istersek derleme zamanı hatası alırız. implicit ve explicit anahtar kelimeleri ile bu durumun nasıl önüne geçebileceğimize bir göz atalım.

Implicit Dönüşümler

C# dilinde X tipindeki bir objeyi Y tipindeki ait bir objeye atamak istersek kodumuz derlenmeyecektir. Bu bilgiye karşın o halde nasıl oluyor da aşağıdaki int tipindeki objeyi long tipindeki bir objeye atayabiliyoruz?

int integerValue = 42;
long longValue = integerValue;

Bu dönüşümü yapabilmemizi sağlayan anahtar kelime implicitdir. implicit dönüşümler hata üretmeyecek olan dönüşüm tipleridir. Tiplerin birbiri ile ilişkili olduğunu belirtir. Bu sayede integer olan bir obje long olan bir objeye atanabilir. Bu tip dönüşümler sırasında hata almayız.

Explicit Dönüşümler

long tipinden olan bir objeyi int olarak tanımladığımız bir objeye atayabilir miyiz? Bunun cevabı ise hem evet hem hayırdır. Aşağıdaki kod bloğuna bakarsak önceki örnekte olduğu gibi doğrudan bir atama yapamadığımızı görebiliriz.

long longValue = 42;
int intValue = (int) longValue;

Doğrudan atama yapamamamızın sebebi bu dönüşümün hatasız bir şekilde olacağının garantisi olmayışıdır. long tipinin alabileceği değerlerin sınırları int objesinden daha geniştir. Bu sebeple dönüşüm sırasında OverflowException oluşabilir veya veri kaybı yaşanarak int değerinin içinde beklediğimiz değeri göremeyebiliriz. Bu sebeple implicit dönüşümlere başvuramamaktayız. İki değer de sayı olduğu için bu dönüşüm yapılabilir fakat bu riskin farkında olunması için implicit dönüşümlerde olduğu gibi otomatik bir dönüşüm dil tarafından yapılmaz. Bunun yerine () ile yazılım geliştiricinin durumun farkında olarak explicit dönüşüm yapması beklenir.

Kısaca bilinçsiz yaptığımız tür dönüşümlerine implicit, bilinçli yaptığımız tür dönüşümlerine explicit dönüşümler demekteyiz.

Kullanım Senaryosu

DDD konseptine bağlı kalarak geliştirmeye çaba harcadığım bir projede UserId , ProjectId , UserPassword gibi birçok değer objesi yer almaktaydı. Bunların büyük bir kısmı Guid , string gibi değerler taşıyan yapılardı. Bu değer objelerini oluştururken aşağıdaki örnekteki gibi öncelikle Guid tipinden bir obje oluşturmaktaydım. Ardından değeri constructor metoduma vererek UserId tipinden bir obje üretmekteydim.

Bu durumun önüne geçmek için aşağıdaki örnekteki gibi implicit dönüşüm operatöründen faydalanabiliriz. Bu sayede Guid objesini doğrudan UserId objesine atayabiliriz.

Bilinçsiz tür dönüşümü yaptığımız senaryolarda metotların aşırı yükleme (method overload) işlemine benzer bir işlemi de yapmış oluyoruz. Örneklemek gerekirse UserId tipinden bir obje alıp işleyen bir metoda sahip olduğumuzu düşünelim. Bu metoda Guid tipinden bir obje ile de çağrı yapabiliriz. Bunun sebebi C# dilinin Guid objesini otomatik olarak UserId tipine çevirerek metodu harekete geçirebilme kabiliyetidir.

Umarım yararlı bir yazı olmuştur. Diğer yazılarıma göz atmak için bu linke tıklayabilirsiniz.

var software = ConvertFrom(caffeine)

var software = ConvertFrom(caffeine)