Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  C++'dan c# 2.0'a bulaşan özellik. Generics ile generic classlar, interfaceler, methodlar, cikcikler, ibibikler yazabiliyoruz. Ne gerek var böyle bir şeye? Çünkü yazılımda zırt pırt, aynı işi gören, fakat farklı tiplerle çalışan sınıflar, metodlar yazmak gerekli olur. Generics sayesinde farklı tiplerle çalışabilen bir tane generic class yazıyoruz, bütün tiplerle kullanabiliyoruz.

Generics olmadan da farklı tiplerle aynı sınıfı kullanmak mümkün tabi. Tiplerin hepsinin atası olan object tipini kullanır, bol bol casting yaparsınız. Ama bunun bir çok sakıncası var. InvalidCastException var, boxing var, unboxing var.

Bir örnek verelim, daha somut olsun.

Örneğin C# ile aşağıdaki Stack sınıfını yazdınız:
public class Stack
{
   object[] items;
   int count;
   public void Push(object item) {...}
   public object Pop() {...}
}

Bu sınıf çok kullanışlıdır, çünkü Push() metoduna istediğiniz sınıfın bir örneğini parametre olarak verebilirsiniz. Parametrenin tipi object olduğu için int de alır, string de, Customer da. Fakat Pop() metoduyla bu nesneleri okuduğunuzda doğru sınıfa cast ederek kullanmanız gerekir. Aşağıdaki gibi:
Stack customerStack = new Stack();
customerStack.Push(new Customer());
Customer c = (Customer) customerStack.Pop();

Stack intStack = new Stack();
intStack.Push(3);
int i = (int) intStack.Pop();

Buraya kadar iyi, güzel. Peki şöyle bir kod yazdığımızı düşünelim:
Stack stack = new Stack();
stack.Push(3);
Customer c = (Customer) stack.Pop();

Bu kod hatalıdır ama derlenirken hata vermez. Çünkü derleyici açısından bir problem yok. Push() ile int tipini object tipine implicit cast yaparak gönderdiniz. Pop() ile de object tipini Customer tipine explicit cast ediyorsunuz. Herşey normal. Ama problem şu ki; object'in referansını tuttuğu şey boxing ile referansa dönüştürülmüş bir value type int. Bu referans Customer'a cast edilemez. Derleyici hata vermez ama runtime bu durumla karşılaşınca InvalidCastException fırlatır. N'apıcaz o zaman? Stack sınıfımız object tipini kullanmasın, her tip için farklı bir Stack yazalım. Mesela StackInt yazalım intlerle çalışsın, StackCustomer yazalım Customer tipleriyle çalışsın. Evet. Çözüm budur. Başka çare yok. Aşağıdaki gibi:
public class StackInt
{
   int[] items;
   int count;
   public void Push(int item) {...}
   public int Pop() {...}
}
public class StackCustomer
{
   Customer[] items;
   int count;
   public void Push(Customer item) {...}
   public Customer Pop() {...}
}

Bu çözüm de hoşumuza gitmiyor. Çünkü çok fazla kod yazmak gerekiyor. Bu aşamada diyoruz ki; "ya şu C#'ın bi özelliği olsa; yukarıdaki sınıflarda int, Customer yazdığımız kısımları generic olarak belirtebilsek." İşte Generics tam da burda devreye giriyor. Kodunuzu aşağıdaki gibi yazıp, aşağıdaki gibi kullanıyorsunuz:
public class Stack<T>
{
   T[] items;
   int count;
   public void Push(T item) {...}
   public T Pop() {...}
}

Stack<int> stack = new Stack<int>();
stack.Push(3);
int x = stack.Pop();

Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
Customer c = stack.Pop();


Sınıf tanımındaki T'leri int ile veya Customer ile replace edin. Yukarıda yazdığımız iki özelleştirilmiş sınıf örneğine dönecek. StackInt ve StackCustomer. Hem de artık sadece bir sınıf ile bu iki sınıfı hatta daha fazlasını (StackString, StackBikBik) belirtebiliyoruz. Çünkü artık sadece bir tane generic sınıfımız var.
fizikci
01 Mart 2005 18:06 ~ 14 Mart 2006 15:49
2.  bkz: generic type instantiation
fizikci
01 Mart 2005 18:12
3.  C#'ta, tip güvenliğini sağlamak uğruna, C++'takine göre yolunmuş tavuğa çevrilen özellik.

Yolunan kısımları aşağıdaki linkte madde madde listelenmiş:
http://msdn2.microsoft.com/en-us/library/c6cyy67b.aspx
fizikci
14 Mart 2006 15:46
4.  Ayrıca bkz. template
mennan
15 Mart 2007 01:37
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
© 2005, Bilişim Kulübü. (1187 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen