C# İle Implicit Operatör Kullanımı

17.07.2015 Hikmet Okumuş 4198 0 C#


Programlarımızda kullanmış olduğumuz veri tiplerini programın akışına göre birbirine atamamız gerekebilmektedir. Örnek olarak aşağıdaki kod satırını verebiliriz.
		        static void Main(string[] args)
		        {
		            int sayi1, sayi2;
		            sayi2 = 10;
		            sayi1 = sayi2;
		
		            Console.ReadLine();
		        }
		
Evet buraya yapmış olduğumuz atamada her iki değişkeninde veri tipleri int' tir. Peki farklı bir tip olsaydı ne yapacaktık ? Casting ya da Convert. İlk olarak Casting işlemini yapalım.
		        static void Main(string[] args)
		        {
		            int sayi1;
		            long sayi2;
		
		            sayi2 = 10;
		            sayi1 = (int)sayi2;
		
		            Console.ReadLine();
		        }
		
(int)sayi2; burada görmüş olduğunuz gibi cast işlemini yapıyoruz. Şimdi Convert işlemini yapalım.
		        static void Main(string[] args)
		        {
		            int sayi1;
		            long sayi2;
		
		            sayi2 = 10;
		            sayi1 = Convert.ToInt32(sayi2);
		
		            Console.ReadLine();
		        }
		
Convert.ToInt32(sayi2); burada da convert işlemini yapıyoruz. Peki örneğimizdeki gibi farkı veri tipleri olsa ve herhangi bir cast ya da convert işlemi yapmadan doğrudan bir atama yapsak acaba nasıl bir sonuç bizi bekleyecek. Uygulayalım.
		        static void Main(string[] args)
		        {
		            int sayi1;
		            long sayi2;
		
		            sayi2 = 10;
		            sayi1 = sayi2;
		
		            Console.ReadLine();
		        }
		
www.hikmetokumus.com
Evet makalemizin konusu bu hata ile başlamaktadır. sayi1 = sayi2; bu örnekte olduğu gibi hiçbir cast ya da convert işlemi olmadan yapılan atama işlemi implicit yöntemini temsil etmektedir. Peki hatayı bize neden verdi ? Çünkü long tipi içerisinde dolaylı olarak int tipine dönüştüren bir implicit operator barındırmamaktadır. Son cümle biraz karışık gelebilir. Aşağıda yapılacak örnek ile konu daha net anlaşılacaktır.
		    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; }
		    }
		
		        static void Main(string[] args)
		        {
		            Personel personel = new Personel() { PersonelId = 1, Ad = "Ali", Soyad = "Can" };
		
		            Kullanici kullanici = personel;
		
		            Console.ReadLine();
		        }
		
www.hikmetokumus.com
Yukarıdaki long işleminde almış olduğumuz hatayı tekrar aldık. Hata bize şunu söylüyor. Yapmaya çalıştığın yöntem implicit, fakat çevirim işleminin nasıl yapılacağını belirtmedin ! Peki o zaman şimdi çevirim işleminin nasıl yapılacağını aşağıdaki gibi belirtelim.
		    class Personel
		    {
		        public int PersonelId { get; set; }
		        public string Ad { get; set; }
		        public string Soyad { get; set; }
		
		        public static implicit operator Kullanici(Personel personel)
		        {
		            Kullanici kullanici = new Kullanici();
		            kullanici.KullaniciId = personel.PersonelId;
		
		            return kullanici;
		        }
		    }
		
Personel sınıfı içerisine implicit operator ekledik ve programı tekrar derlediğimizde derleyici artık bize kızmayacaktır. Çünkü Personel sınıfından Kullanıcı sınıfına çevirim işleminin nasıl yapılacağını artık implicit operator yöntemi belirtmektedir.
Implicit yöntemine nerede / nasıl ihtiyaç duyarım ? Bu sorunun bir çok cevabı var. Ben sadece fikir vermesi açısından bir örnek üzerinde cevap vereyim. Aşağıdaki gibi bir sınıfımız olsun.
		    class Uye
		    {
		        public int Id { get; set; }
		        public string Ad { get; set; }
		        public string Soyad { get; set; }
		        public string Kod { get; set; }
		        public DateTime Yas { get; set; }
		        public bool Durum { get; set; }
		        public bool Cinsiyet { get; set; }
		        public DateTime UyelikTarihi { get; set; }
		        public DateTime SonGiris { get; set; }
		        public string Aciklama1 { get; set; }
		        public string Aciklama2 { get; set; }
		        public string Aciklama3 { get; set; }
		        public string Aciklama4 { get; set; }
		        public int OzelAlan1 { get; set; }
		        public int OzelAlan2 { get; set; }
		        public int OzelAlan3 { get; set; }
		        public int OzelAlan4 { get; set; }
		    }
		
Yukarıdaki gibi bir data objemizin olduğunu düşünelim. Tabi gerçek senaryolarda bu alanların çok daha üzerinde kolona sahip tablolar mevcuttur. Bizim örneğimiz için şimdilik bu kadar alan yeterlidir.
Şöyle bir işlem yaptığımızı hayal edelim. Server ve Client taraflarında çalışan bir uygulamamız var. Client tarafında kullanıcı üye girişi yapmak için bilgilerini giriyor ve Giriş butonuna basıyor. İstek Server tarafına gitti ve giriş işlemini yaptık. Geriye client tarafına bir sonuç döndürücez. Bu sonuç objesi Uye tipinde olacak. Fakat bana dönecek sonuç içerisinde sadece Ad ve Soyad bilgileri gerekiyor. Kullanılmayacak diğer alanları döndürmek program için gereksiz bir şekilde ekstra yük oluşturacaktır.
Çözümüm nedir ? Bir info objesi oluşturmak.
		    class Uye
		    {
		        public int Id { get; set; }
		        public string Ad { get; set; }
		        public string Soyad { get; set; }
		        public string Kod { get; set; }
		        public DateTime Yas { get; set; }
		        public bool Durum { get; set; }
		        public bool Cinsiyet { get; set; }
		        public DateTime UyelikTarihi { get; set; }
		        public DateTime SonGiris { get; set; }
		        public string Aciklama1 { get; set; }
		        public string Aciklama2 { get; set; }
		        public string Aciklama3 { get; set; }
		        public string Aciklama4 { get; set; }
		        public int OzelAlan1 { get; set; }
		        public int OzelAlan2 { get; set; }
		        public int OzelAlan3 { get; set; }
		        public int OzelAlan4 { get; set; }
		
		        public static implicit operator UyeInfo(Uye uye)
		        {
		            UyeInfo uyeInfo = new UyeInfo();
		            uyeInfo.Id = uye.Id;
		            uyeInfo.Ad = uye.Ad;
		            uyeInfo.Soyad = uye.Soyad;
		
		            return uyeInfo;
		        }
		    }
		
		    class UyeInfo
		    {
		        public int Id { get; set; }
		        public string Ad { get; set; }
		        public string Soyad { get; set; }
		    }
		
Evet artık geriye UyeInfo sınıfımı döndürebilirim ve client akışı için gereksiz alanları boşuna client tarafına göndermemiş olurum. Dilerim faydalı bir anlatım olmuştur.

Başarılar dilerim.




Yorum