İlkolarak 2005 yılındaki PDC (Professional Developer Conference) ileduyurulmuştur. Yenilikler içerisinde ilk göze çarpan özellik veri türütanımlama işlemlerinin yapılmasına gerek kalmamasıdır. İlk atanandeğerin türü veri türü olarak oluşturulmakta, bunun haricinde Lambdaifadeleri ve LINQ en önemli yeniliklerdir.
Tür belirtilmeden türetilen değişkenler
C#3.0 ile gelen ve en sık kullanılan özelliklerden birisidir. Yeni birdeğişken tanımlarken daha önce olduğu gibi değişkenlerin türlerinibelirtmek yerine var anahtar sözcüğü kullanılaraktürünü vermeden değişken tanımlama imkanına sahip olunmaktadır.Değişkenlerin türlerinin belirlenmesi derleme zamanındabelirlendiğinden herhangi bir performans kaybına da neden olmamaktadır.Bu özellik kullanılırken unutulmaması gereken nokta yaratılandeğişkenin o anda atama işlemine tabi tutulmasıdır yoksa bu değişkentanımı geçersiz sayılmaktadır.
var ogrenciAdi = "TestOgrenci";
var numarasi = 60519;
Console.WriteLine(ogrenciAdi.GetType());
Console.WriteLine(numarasi.GetType());
Console.WriteLine(ogrenciAdi + "öğrencinin numarası: " + numarasi);
Buözellik kullanılırken dikkat edilmesi gereken bir diğer nokta ilktanımlama yapılırken atanan değer daha sonra başka bir atama iledeğiştirilmek istendiği takdirde yeni değerinde önceki değer ile aynıolması gerekmektedir.
Değişkenlerde olduğu gibi veri türleri oluştururken de var anahtar sözcüğü kullanılabilir.
Yapıcılandırıcıların aşırı yüklenmesi
Nesnelerinoluşturulması sırasında o sınıfa ait yapıcı yordam kullanılmaktadır.Farklı sayıda veya türde parametre kullanmak için yapıcılara aşırıyükleme yapmak mümkündür. C# 3.0 ile bu biraz daha geliştirilereknesneye ait özellikler tek bir yapıcı üzerinde tanımlanarakkullanılabilmektedir. Bu sayede girilecek parametrelerin sayısına görefarklı yapıcı yordamlar oluşturulmamış olacaktır.
public class iletisimBilgi
{
public int telefon;
public string adres;
}
public class ogrenci
{
public int ID;
public string isim;
public iletisimBilgi iletisim;
}
var ogrenci1 = new ogrenci { ID = 34567 };
var ogrenci2 = new ogrenci { isim = "TestOgrenci", ID = 34578 };
Parçalı Metotlar (Partial Methods)
Parçalı sınıflardaki yapıya benzer şekilde C# 3.0 ile birlikte metotları da partial(parçalı) tanımlamak mümkün olmaktadır. Böylece yazılımgeliştiricinin kodunun herhangi bir yerinde tanımlamış olduğu birmetodun işlevlerini tanımlaması için o koda bağımlı kalması gerekmez.
Metodun tanımlanması ve kullanılması farklı alanlarda yapılabilir hale gelmektedir. Parçalı metotların tanımlanması sırasında partial sözcüğü kullanılmalıdır ve her zaman void dönmek zorundadır. Parçalı metotlar tanımlandıklarında private olarak oluşturulurlar. Parçalı metotlar için delegate (temsilci) oluşturulamaz.
Genişletme Metodları (Extension Methods)
Genişletmemetotları C# 3.0 ile birlikte gelen yeni yapılar ve öncekiversiyonlarda yer alan metotların kullanımının devamının sağlanmasıiçin kullanılmaya gerek duyulmuştur. Genişletme metotları ile sahipolunan sınıflar manual (elle) yaratılmamış olsa dahi sonradan yeniözellikler katılabilmesini sağlamaktadır. Öyleki bu sayedekoleksiyonlar, datatable, dizi gibi var olan CLR (Common LanugageRuntime) tipleri üzerinde LINQ tarzı sorgu ifadelerinin yazılabilmesiolanaklı hale gelmiştir.
Genişletme metotları var olantiplere ek işlevler kazandırılmasını sağlarken bunların orijinalyapısını asla bozmazlar. Tanımlandıkları programda, uygulandıklarıtipin bir parçası olarak yaşar ama o tipin orijinalliğine etki etmedenek işlevselliklerin kullanılabilmesini olanaklı kılarlar. Genişletmemetodlarının oluşturulması sırasında unutulmaması gereken bir nokta bumetotların static olarak tanımlanma zorunluluğudur.
Lambda İfadeleri
Lambdaifadeleri C# 3.0 ile gelen belkide en önemli özelliklerden birisidir.Bunun nedenleri arasında karmaşık işlemleri basit şekilde yazılmasınaolanak sağlaması açısından yazılımcılara yararının yanı sıra LINQ konusunda da fazlasıyla kullanışlıdır.
Framework tabanlı dillerde kullanılmakta olan Lambda ifadeleri Lisp, Python gibi dillerde de bulunmaktadır. Lambda operatörü ( => )bool sonuç döndürmekte olan bir operatördür. Lambda operatörünün nedenbu kadar önemli olduğunu anlamak açısından delege (temsilci) yapısındanbahsetmek daha yararlı olacaktır.
İlk zamanlardan itibaren.NET içerisinde temsilcilere yer verilmektedir. Değişkenlerin türleriolduğu gibi yordamların da kendilerine özgü türleri vardır. Bu türleritemsil eden yapılara temsilci denmektedir. Temsilciler yordamlarınkonumlarına işaret etmektedir ve ne zaman bir yordamı kullanmak istesektemsilciler aracılığı ile onlara ulaşmak mümkün olmaktadır.
public delegate int temsilci(int carpan1, int carpan2);
public static void Main(string[] args)
{
var temsilci1 = new temsilci(carpma);
int carpim = temsilci1(3, 4);
Console.WriteLine(carpim);
}
static int carpma(int sayi1, int sayi2)
{
return sayi1 * sayi2;
}
Burada unutulmaması gereken noktalardan birisi temsilcilerinyordamların adreslerine işaret etmelerinden dolayı tanımlanan yordamlarstatic olmak zorundadır.
Aşağıda Lambda operatörü ile benzer işlemin ne kadar kısa yapabildiğini gösteren bir uygulama bulunmaktadır.
public delegate int toplama(int toplanan1, int toplanan2);
public static void Main(string[] args)
{
toplama islem = (x, y) => x + y;
int toplam = islem(3, 4);
Console.WriteLine(toplam);
}
Aşağıda, lambda ifadelerinin LINQ ile olan uygulamalarına geçilmeden önce kısaca LINQdan bahsedilmiştir.
LINQ (Language Integrated Query)
LINQdil ile bütünleşmiş sorgu kelimelerinin harflerinden oluşmuş birifadedir. Burada isminden de anlaşılacağı gibi dil içerisinde ifadelerkullanılarak yapılan sorgular akla gelmektedir. Veritabanları belki deLINQ'in isminin en çok anılmasına sebep veren alandır ama LINQ sadeceveritabanı için değil daha pek çok uygulamada kullanılabilecek gelişmişözelliklere sahiptir.
LINQ genel olarak genişletmemetotları ve Lambda ifadeleri kullanmaya dayanan bir yapıdır. Farklıkullanım alanlarına göre sahip olduğu metotlar bulunmakta ve bunlarınbelli başlıklar altında toparlanabilmesi mümkün olabilmektedir. XLINQve DLINQ bunlara örnek verilebilir. DLINQ veritabanı işlemlerindekullanılan sorguların C# dili ile gerçekleştiği şeklidir. Aynı şekildeXLINQ içinde XML içeriklerinin sorgulanmasında kullanıldığından önemlibir yere sahiptir.
List<Calisan> Calisanlar = new List<Calisan>();
Calisanlar.Add(new calisan{isim = “TestOgrenci1”, no = 123});
Calisanlar.Add(new calisan{isim = “TestOgrenci2”, no = 124});
Calisanlar.Add(new calisan{isim = “TestOgrenci3”, no = 125});
Calisanlar.Add(new calisan{isim = “TestOgrenci4”, no = 126});
Calisanlar.Add(new calisan{isim = “TestOgrenci5”, no = 127});
IEnumerable<string> sonuclar = from val in calisanlar where val.no>125 orderby val.isim select val.isim.ToUpper();
var isimler = “ ” ;
foreach(string ad in sonuclar)
{
isimler += ad + “ ” ;
}
Console.WriteLine(isimler);