Operatörleri uygulamalarımızda sık sık kullanmaktayız. Mesela 2 integer değişken tanımlayıp ‘ + ‘ operatörü ile bu iki değişkeni toplayıp başka bir integer’a atarız. Sonuç olarak iki sayının toplamını elde etmiş oluruz. İşte bu tarz işlemleri kendi yazdığımız tiplerde de uygulamak isteyebiliriz. Adı, id’si ve fiyatı olan iki Urun değişkenini + operatörü ile toplamaya kalktığımızda, fiyatlarının toplamını elde etmek isteyebiliriz. İşte bu noktada yapmamız gereken tek şey, ‘ + ‘ operatörünü aşırı yükleyerek, o sınıfa özel bir işlev kazandırmak olmalıdır.
Siparis adında bir sınıf yazalım ve bazı operatörleri aşırı yükleyerek farklı anlamlar kazandırmaya çalışalım.
public class Siparis
{
public int SiparisNo { get; set; }
public string Adres { get; set; }
public double Tutar { get; set; }
public static double operator +(Siparis s1, Siparis s2)
{
return s1.Tutar + s2.Tutar;
}
public static bool operator ==(Siparis s1, Siparis s2)
{
return s1.SiparisNo == s2.SiparisNo;
}
public static bool operator !=(Siparis s1, Siparis s2)
{
return s1.SiparisNo != s2.SiparisNo;
}
}
‘ + ‘ operatörünün iki sipariş nesnesi için toplam fiyatı vermesini sağladık. ‘ == ‘ ve ‘ != ‘ operatörlerini de, siparişlerin numaralarını kıyaslayacağını belirtmiş olduk. Şimdi de Program tarafında minik bir test yapalım.
class Program
{
static void Main(string[] args)
{
Siparis s1 = new Siparis { SiparisNo = 100, Adres = "Kadıköy", Tutar = 200 };
Siparis s2 = new Siparis { SiparisNo = 120, Adres = "Üsküdar", Tutar = 80 };
Siparis s3 = new Siparis { SiparisNo = 100, Adres = "Maslak", Tutar = 40 };
double toplam = s1 + s2;
Console.WriteLine(toplam);
if (s1 == s3)
{
Console.WriteLine("Sipariş numaraları eşittir");
}
if (s1 != s2)
{
Console.WriteLine("Sipariş numaraları eşit değildir");
}
}
}
Ekran çıktısı aşağıdaki gibi olacaktır.
Bunun yanısıra, biliçli veya bilinçsiz yapılan atamalarda da = operatörünün davranışlarını değiştirebilmemiz mümkündür. Sipariş sınıfının kodlarına aşağıdaki eklemeleri yapalım.
public static implicit operator int(Siparis s)
{
return s.SiparisNo;
}
public static explicit operator string(Siparis s)
{
return s.Adres;
}
Siparis tipinden bir nesne örneğini bilinçsiz olarak integer tipinden bir değişkene atamak istediğimizde, sipariş numarasını geriye döndüreceğini belirttik. Aynı şekilde, bilinçli bir tür dönüşümü yapıldığında da geriye siparis adresinin döneceğini belirtmiş olduk.
class Program
{
static void Main(string[] args)
{
Siparis s1 = new Siparis { SiparisNo = 100, Adres = "Kadıköy", Tutar = 200 };
Siparis s2 = new Siparis { SiparisNo = 120, Adres = "Üsküdar", Tutar = 80 };
Siparis s3 = new Siparis { SiparisNo = 100, Adres = "Maslak", Tutar = 40 };
int no = s1;
Console.WriteLine(no);
string adres = (string)s1;
Console.WriteLine(adres);
}
}
Ekran çıktısı aşağıdaki gibidir.
Framework içerisinde varolan tiplerden de örnekler bulabilmemiz mümkündür. Nullable tipini inceleyelim.
class Program
{
static void Main(string[] args)
{
Nullable<int> sayi = 5; // bilinçsiz atama (implicit)
int gelen = (int)sayi; // bilinçli atama (explicit)
sayi = 20;
}
}
ilk satırda, integer tipinden bir değişkeni bilinçsiz olarak int? tipine, yani Nullable<int> tipine atadık. İkinci satırda ise int? tipindeki bir değişkeni bilinçli olarak integer tipinden bir değişkene atadık. Bu kuralların bir yerlerde yazılı olması gerektiğini hepiniz farketmişsinizdir. Nullable<T> tipi üzerinden Go to definiton yapalım. Aşağıdaki manzara ile karşılacağız.
0 yorum:
Yorum Gönder