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.
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 implicit
dir. 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.
Bonus
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.