Bir önceki makalede Implicit operatöründen bahsetmiştim. Explicit operatörüde Implicit operatöründe olduğu gibi bir çevrim işlemi yapmaktadır. Fakat bu çevrim işlemini dolaylı değil doğrudan yapmaktadır. Yani bir çevrim tipi belirtmek zorunludur.
class Program { static void Main(string[] args) { Personel personel = new Personel() { PersonelId = 1, Ad = "Ali", Soyad = "Can" }; Kullanici kullanici = personel; Console.ReadLine(); } } class Personel { public int PersonelId { get; set; } public string Ad { get; set; } public string Soyad { get; set; } } class Kullanici { public int KullaniciId { get; set; } public string KullaniciKod { get; set; } }
Yukarıdaki gibi bir çevrim işleminde derleyici bir dolaylı atama olduğunu kabul eder. Fakat atama yapılacak operatör tanımı olmadığı için hata verir.
Evet burada çevrim işlemini yapacak olan Explicit operatörümüzü tanımlayalım.
class Personel { public int PersonelId { get; set; } public string Ad { get; set; } public string Soyad { get; set; } public static explicit operator Kullanici(Personel personel) { Kullanici kullanici = new Kullanici(); kullanici.KullaniciId = personel.PersonelId; return kullanici; } }
Programımızı tekrar derlediğimizde editör bize gene kızacaktır.
Editör bize hatada şunu demektedir. İki tip birbirine dönüştürülemiyor. Fakat explicit bir çevrim içermektedir. Çevrim işlemin eksik olabilir mi ? şeklinde bir hata vermektedir. Explicit bir çevrim yapmak için çevrim yapılacak objenin önüne parantez içerisinde çevrilecek tip bilgisi yazılmalıdır.
class Program { static void Main(string[] args) { Personel personel = new Personel() { PersonelId = 1, Ad = "Ali", Soyad = "Can" }; Kullanici kullanici = (Kullanici)personel; Console.ReadLine(); } }
Artık derleyicimiz bize hata vermeyecektir.
Peki hangi durumda Explicit ya da Implicit çevrimini kullanmalıyım. Ayrım şurada başlıyor. Implicit operatör içeren bir sınıf diğerine çevrilirken derleyici hata vermez. Birden fazla çevrim tipi olabilir ve dolaylı olarak çevrim yaptığı için veri kayıpları yaşanabilir. Explicit operatör içeren bir sınıf diğerine çevrilirken tip belirtmeyi şart koştuğu için kullanıcı hangi çevrimin yapıldığını kontrol altına alabilir ve olası veri kayıplarını önleyebilir.
Başarılar dilerim.