1. Auto-Property Initializer
C#’da fieldlar için initializer daha öncesinde mevcuttu fakat auto-propertyler için initializer mevcut değildi. C# 6.0 ile birlikte auto-propertyler içinde initializer özelliği gelmekte.
public class School
{
public string Name {get; set;} = "KTU";
}
2. Primary Constructors{
public string Name {get; set;} = "KTU";
}
C#’ın şu anki versiyonlarında constructor methodlarına parametre gönderebiliryoruz. Bulara bildiğiniz gibi primary constructor diyoruz.
public class School
{
public Student(string name)
{
this.Name = name;
}
}
Aşağıda örnek bir primary constructor yazımını görebilirsiniz.{
public Student(string name)
{
this.Name = name;
}
}
public class School(string name)
{
}
Constructor ile gelen parametre ile class içerisindeki bir auto-property’i atayabilirsiniz.{
}
public class School(string name)
{
public string Name {get; set;} = name;
}
Primary constructor’dan gelen name parametresini auto-property initializer ile Name propertysine atadık.{
public string Name {get; set;} = name;
}
3. Field Parameters
Bazı durumlarda, constructor parametresi ile bir private field’a bir value atamak istemeyebiliriz.
Tabi ki auto-property initializers işinizi görüyorsa, böyle bir koda gereksiniminiz kalmaz.
Bir örnek ile inceleyelim
public class School
{
private DateTime BirthDay;
public Customer(DateTime BirthDay)
{
this.BirthDay = BirthDay;
}
public int Age { get { return DateTime.Subtract(BirthDay).Days/365;} }
}
Yuakarıdaki örnekte , Age propertysini hesaplayabilmemiz için, BirthDay değişkeninin değerine ihtiyacımız var. Primary Constructor ile, method içerisinde Age public propertysini constructor’dan gelen BirthDay parametresi ile daha kısa yoldan hesaplayabilir ve Age propetysini tanımlayabiliriz.{
private DateTime BirthDay;
public Customer(DateTime BirthDay)
{
this.BirthDay = BirthDay;
}
public int Age { get { return DateTime.Subtract(BirthDay).Days/365;} }
}
public class Customer(private DateTime BirthDay)
{
public int Age { get { return DateTime.Subtract(BirthDay).Days/365;} }
}
Yukarıdaki kod bloğunda dikkat etmemiz gereken husus, Constructor methodu içerisinde bir public property tanımlayabilmemizdir.{
public int Age { get { return DateTime.Subtract(BirthDay).Days/365;} }
}
4. Declaration Expressions
Çoğu zaman yazdığımız programlar, kullanıcından bir string değer alır ve biz bunları parse işlemine tabi tutarız ve genellikle aşağıdaki kod bloğunda olduğu gibi bir yol izleriz.
int count = 0;
if(int.TryParse(parameter, out count))
{
}
Declaration Expression özelliği ile birlikte aşağıdaki kod bloğunda olduğu gibi bir count değişkeni tanımlamamıza gerek kalmıyor. TryParse methoduna gönderdiğimiz out count parametresi otomatik olarak tanımlanmış oluyor.if(int.TryParse(parameter, out count))
{
}
if(int.TryParse(parameter, out int count))
{
}
Göndereceğiniz iki tane int parametresi yerine var da kullanabilirsiniz çünkü derleyici int.TryParse methoduna gönderilen parametrelerin tipini tahmin edecektir. C# 6.0 ile birlikte aşağıdaki kod bloğunu kullanabilirsiniz.{
}
void GetCoordinates(out int x, out int y)
{
} GetCoordinates(out var x, out var y);
GetCoordinates methodunu çağırdığımızda, compiler, methoda gönderilen x ve y parametrelerini tiplerini anlar.{
} GetCoordinates(out var x, out var y);
5. Exception Filters
Adından da anlaşılacağı gibi, Exception Filters bir exception oluştuğunda onları filtreleyebilmemizi sağlıyor.
Aşağıdaki kod bloğuna bir bakalım :
try{...}
catch(CustomException ex)
{
if(ex.Origin.Equals("some origin"))
{
}
throw ex;
}
Yukarıdaki kod bloğundaki problem, bir exception oluştuğunda, catch bloğında tekrar thrown edilmesidir ve stracktrace‘de ki önemli verilerin kaybolmasına yol açar. Burada stacktrace verisini kaybetmemek için throw ex yerine throw kullanabilirsiniz. Exception filters bizlere catch bloğunun içinde yapacağımız bir filtrelemeden daha iyi ve kısa bir yol sağlar. Exception Filters‘in nasıl kullanıldığı ile ilgili kod bloğunu aşağıda görebilirsiniz.catch(CustomException ex)
{
if(ex.Origin.Equals("some origin"))
{
}
throw ex;
}
try {...}
catch(MyCustomerException ex) if(ex.Origin.Equals("some origin"))
{
throw ex;
}
Yukarıda, kod bloğundaki condition sonucu true olursa, catch bloğu içerisindeki kod çalıştırılacak. Eğer sonuç false olarak dönerse, bir exception olmadığı varsayılacak ve diğer exceptionlar için stacktrace datasını kaybetmemiş olacağız.catch(MyCustomerException ex) if(ex.Origin.Equals("some origin"))
{
throw ex;
}
6. Indexed members ve Element initializers
C#’ın şu anki versiyonlarında dictionary veya diğer veri yapılarını kullanırken, aşağıdaki kod bloğunda olduğu gibi normal element initializer’u kullanırız.
var teens = new Dictionary
{
{9, "Nine"},
{10, "Ten"},
...
}
veya aşağıdaki şekilde de yazabiliriz{
{9, "Nine"},
{10, "Ten"},
...
}
var teens = new Dictionary
{
[9] = "Nine",
[10] = "Ten",
...
}
Çok basit bir özellik gibi görünse de, bazı durumlar için işimizi çok kolaylaştırıcı olabilir.{
[9] = "Nine",
[10] = "Ten",
...
}
var kitap = new JsonData();
kitap["name"] = "C# Temelleri";
kitap["ISBN"] = 1254125563;
ve aşağıdaki şekilde de kullanabiliriz.kitap["name"] = "C# Temelleri";
kitap["ISBN"] = 1254125563;
var kitap = new JsonData{
$name = "C# Temelleri",
$ISBN = 1254125563
};
7. Diğer yenilikler $name = "C# Temelleri",
$ISBN = 1254125563
};
C# 6.0’daki diğer yeniliklere gelince, catch ve finally blokları içerisinde await kullanabilmek, collectionların add methodlarında initializers özelliği, binary liternals (bir int değişekene direk binary değer verebilmek) ve digit separators (sayılsal bir değişkene değer verirken basamakları _ ile ayırabiliriz) . Bunları kullanmak sizin kişisel zevkinize kalmış.
Kaynak Linki: http://www.kodstrap.com/makale/orneklerle-c-60-yenilikleri/8048
İyi Kodlar!
Yorumlar
Yorum Gönder