C# As ve Is Operatörleri Bazen Hayat Kurtarır
Bugün bir bankanın yazılım ekibine verdiğim bir derste As ve Is operatörlerinin nesnel bir yazılım mimarisinde ne kadar da işe yarayabileceğini gördüm. Şimdi kısaca sizinle paylaşmak istiyorum.
Derste amaç, generic metodları gerçek hayat projelerine karşı olması gereken bir bakış açısıyla anlatmaktı. Bir örnek yaptım. Yine örneğimin konusu YazilimDevi.Com idi. Bizim için Makale ve Video birer Ders’tir. Dolayısıyla sadece belirli özellikleri ile birbirinden ayrılırlar.
Öncelikle Ders(Base),Makale ve Video sınıflarımıza bakalım.
Ders.cs
- class Ders
- {
- private int _id;
-
- public int Id
- {
- get { return _id; }
- set { _id = value; }
- }
-
- private string _baslik;
-
- public string Baslik
- {
- get { return _baslik; }
- set { _baslik = value; }
- }
- }
class Ders
{
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
private string _baslik;
public string Baslik
{
get { return _baslik; }
set { _baslik = value; }
}
}
Makale.cs
- class Makale:Ders
- {
- private string _detay;
- public string Detay
- {
- get { return _detay; }
- set { _detay = value; }
- }
- }
-
class Makale:Ders
{
private string _detay;
public string Detay
{
get { return _detay; }
set { _detay = value; }
}
}
Video.cs
- class Video:Ders
- {
- private string _dosyaYol;
- public string DosyaYol
- {
- get { return _dosyaYol; }
- set { _dosyaYol = value; }
- }
- }
-
class Video:Ders
{
private string _dosyaYol;
public string DosyaYol
{
get { return _dosyaYol; }
set { _dosyaYol = value; }
}
}
Madem bunlar benzer yapılar. Bunların ortak metodları da olmalı. Mesela Ekle metodu:) Generic yapalım.
DersDAL.cs
- class DersDAL
- {
- public void Ekle<T>(T ders)where T:Ders
- {
- if (ders is Makale)
- {
- Makale makale = ders as Makale;
- Console.WriteLine(string.Format("{0} isimli makale eklendi, Detay = {1}",makale.Baslik,makale.Detay));
- }
- if (ders is Video)
- {
- Video video = ders as Video;
- Console.WriteLine(string.Format("{0} isimli video eklendi, Yol = {1}", video.Baslik,video.DosyaYol));
- }
- }
- }
-
class DersDAL
{
public void Ekle<T>(T ders)where T:Ders
{
if (ders is Makale)
{
Makale makale = ders as Makale;
Console.WriteLine(string.Format("{0} isimli makale eklendi, Detay = {1}",makale.Baslik,makale.Detay));
}
if (ders is Video)
{
Video video = ders as Video;
Console.WriteLine(string.Format("{0} isimli video eklendi, Yol = {1}", video.Baslik,video.DosyaYol));
}
}
}
Burada Ekle metodunun generic olduğunu ve T:Ders şeklinde generic bir kısıt koyulduğunu görmekteyiz. Yani “T”, Ders veya Ders’ten türeyen bir nesne olabilir.
Daha sonra Ders’in Makale veya Video’dan hangisinin olduğunu yakalamamız gerekiyor. Burada imdadımıza “is” operatörü çıkıyor.
Buraya kadar herşey güzel fakat asıl sıkıntı burdan sonra başlıyor. Çünkü ben “T ders” ile sadece Ders objesinin özelliklerine ulaşabilirim. Mesela eğer gönderilen obje Makale olsa bile, onu Ders üzerinden tükettiği için “Detay” özelliğine ulaşmak mümkün olmayacaktır. Dolayısıyla aşağıdaki gibi bir Cast işlemi mümkün olmayacaktır.
İşte burada yardımımıza “As” operatörü koşuyor. As çalışma anında Cast yapmaya çalışıyor. Çevirebilirse ne mutlu bize. Çeviremezse null atar. Hepsi bu. Zaten “is” ile kontrol yaptığımız için sorun olmayacağı da kesin.
Aşağıda da bir kullanım örneği ekliyorum.
- class Program
- {
- static void Main(string[] args)
- {
- DersDAL dd = new DersDAL();
- dd.Ekle<Video>(new Video {Baslik="C# Generics",DosyaYol="falan filan" });
- Console.ReadLine();
- }
- }
-
class Program
{
static void Main(string[] args)
{
DersDAL dd = new DersDAL();
dd.Ekle<Video>(new Video {Baslik="C# Generics",DosyaYol="falan filan" });
Console.ReadLine();
}
}
Faydalı olması dileğiyle.
Engin Demiroğ,MCT,engin@yazilimDevi.com