C# 6.0 ile gelen yenilikler

1 – AUTO PROPERTY

public class CustTest
{
public string First { get; set; } = “Test”;
public string Last { get; set; } = “Test2”;
}

Artık bu şekilde classlarımız içerisinde oluşturduğumuz propertylerimize default değerler verebiliyoruz. C# 6.0 dan önce bunu yapmak isteseydik üst satırlarda bir field’ımız olması gerekirdi ve get set ile onu kullanırdık.

public class CustTest
{
public string First { get; } = “Test”;
public string Last { get; } = “Test2”;
}

Burada da sadece Getter only bir propertymiz var. C#6.0 öncesinde böyle bir tanımlama yapmamız mümkün değildi. Getter only property sayesinde readonly bir property yapmış oluyoruz. Bir örnek daha verelim

public class CustTest
{
public string Name { get; };
public CustTest(string first, string last)
{
Name = first + ” ” + last;
}
}

Bu örneğimizde de readonly dışında bir kullanım görmüş olduk.

2 – EXPRESSION BODIED FUNCTION MEMBERS
Lambda işareti ile geneleksel metot gövdesi yerine geçecek bir ifade tanımlayabilirim.
Lambda expressionları artık methodlarda da kullanabiliriz. Mesela aşağıda return yazmadan direk lambda ile (=>) ile ilgili string result gönderelebilir.

public override string ToString() => $"({_x},{_y})";

Property Tanımlamada Lambda Kullanımı: Aşağıdaki property yerine bir altındaki kod tanımı yapılabilir.

public double Dist
{          
   get { return Sqrt(_x * _x + _y * _y); }
}

Yeni Yazım Şekli: Lambda kullanılarak (=>)hatta get bile kullanılmadan aşağıdaki gibi ilgili property tanımlanabilir.

public double Dist=> Sqrt(_x * _x + _y * _y);

Expression bodies on property-like function members:

public string Name => “Test”;

Expression bodies on method-like members:

public string GetName(string name, string surname) => name + surname;

Burada yapmış olduğum aslında şu;

public string GetName(string name, string surname)
{
return name + surname;
}

3 – USING STATIC
Namespace gibi namespace altındaki static classlarımızıda ekleyebileceğiz.

using System.Console;
using System.Math;
class Program
{
static void Main()
{
WriteLine(Sqrt(3*3 + 4*4));
}
}

4 – NULL-CONDITIONAL OPERATORS
Null kontrolleri daha hızlı yapmamızı sağlıyor.
Aşağıda json değerleri çekerken herbir değer için null kontrolü yapılmıştır. Böylece ilgili json kordinatlar integer’a pars edilip Point olarak geri döndürülmüştür.
Eski Yöntem:

if (json != null &&
                json["startCordinate"] != null &&
                json["startCordinate"].Type == JTokenType.Integer &&
                json["endCordinate"] != null &&
                json["endCordinate"].Type == JTokenType.Integer
                )
            {
                return new Point((int)json["startCordinate"], (int)json["endCordinate"]);
            }

Yeni Yöntem:

if (json["startCordinate"]?.Type == JTokenType.Integer && json["endCordinate"]?.Type == JTokenType.Integer)
{
    return new Point((int)json["startCordinate"], (int)json["endCordinate"]);
}

Burda “?” işareti konarak ilgili nesnenin null kontrolü kolaylıkla yapılmaktadır. Nesne null ise zaten “?” işaretinden sonraki kısıma geçilmez.

int? length = custTests?.Length; // eğer custTests null ise null atar değil ise custTests.Length’ı atar.
int length = custTests?.Length ?? 0; // Eğer custTests null ise sıfır atar değil ise .Length’i atar.

5 – STRING INTERPOLATION

var s = String.Format(“{0} is {1} year{{s}} old”, p.Name, p.Age);

bu şekilde bir kullanım yerine
string ifadenin içinde field atmamızı sağlıyor. Örneğin;

var s = “\{p.Name} is \{p.Age} year{s} old”;

6 – NAMEOF EXPRESSIONS
Gerçekten güzel bir soruna çözüm üretilmiş. Yeni yöntem olan nameof keyword’ü kullanımı ilerde kodda oluşabilecek değişikliklerde büyük kolaylıklar sağlar.

(if x == null) throw new ArgumentNullException(“x”);

şeklinde x null olduğunda bir exception fırlatıyor iyi hoş
Ancak kodumda x’i değiştirdiğim editör benim için tüm xleri değiştiriyor olmasına karşılık “x” şeklinde belirtiğim
String ifadeyi haliyle değiştiremiyor, bu yüzden nameof kullanıyoruz.

(if x == null) throw new ArgumentNullException(nameof(x));

7 – INDEX INITIALIZERS
Enteresan bir özellik olmuş, kolay bir şekilde indexlemeye yarıyor.Aynı propertylerde olduğu gibi indexleri de yaratılırken kendi içlerinde değerlerini atayabiliriz. Aşağıda bir json object için herbir index değerine eski yol ile tek tek değer atanmıştır.
Eski Yöntem:

public JObject ToJsonCordinate()
{
    var result = new JObject();
    result["startCordinate"] = _x
    result["endCordinate"] = _y;
    return result;
}

Yeni Yöntem:
Değişken tanımlanmadan doğrudan değerler tanımlama sırasında atanmıştır.

public JObject ToJsonCordinate()
{
    var result = new JObject() {["startCordinate"] = _x,["endCordinate"] = _y };
    return result;
}
var numbers = new Dictionary<int, string>
{
[7] = “seven”,
[9] = “nine”,
[13] = “thirteen”
};

8 – EXCEPTION FILTERS
Catch bloğu içerisinde bir if şartı yazmak yerine daha pratik bir kullanım getirilmiş. VB ve F# da vardı ve artık C# da gelmiş oldu.

try { … }
catch (SqlException e) if (e.ErrorCode > 999)

Hata yakalama anında filitreleme yapılabilmektedir. Bu da belirlenen kriterlere göre hata fırlatılmasını sağlamaktadır. Aşağıdaki örnekte “0”‘a bölünme durumunda bölünen sayı 50’den küçük ise “0” değilse “1” değeri dönmesi hata yakalama anında koşul belirlenerek yapılmıştır.

public double DivideNumber(int number1, int number2)
{
   try
   {
      return number1 / number2;
   }
   catch (DivideByZeroException ex) when (number1 >50)
   {
      return 1;
   }
   catch (DivideByZeroException ex) when (number1 <50)
   {
      return 0;
   }
}

9 – AWAIT IN CATCH AND FINALLY BLOCKS
finally ve catch bloklarında await kullanımını bize sağlayan özelliğimiz. C#5.0 ile gelen async await kullanımının bazı kısıtları vardı. Catch ve finally blocklarında wait ile beklemek zorunda kalıyorduk, artık bundan kurtulduk.
Eğer hata fırlatma anında yoğun bir işlem yapılacak ise bunu asenkron çalıştırmak performans anlamında bize büyük kolaylık sağlayabilir. İşte bu noktada aşağıdaki örnekde olduğu gibi hata fırlatma anında loglama ve mail atma işlemleri asenkron yapılabilmektedir.

Resource res = null;
try
{
res = await Resource.OpenAsync(…); // Bu yapılabilirdi. …
}
catch(ResourceException e)
{
await Resource.LogAsync(res, e); // Şimdi bunuda yapabilirsiniz …
}
finally
{
if (res != null) await res.CloseAsync(); // … ve bunu.
}
public double DivideNumber(int number1, int number2)
{
   try
   {
      return number1 / number2;
   }
   catch (DivideByZeroException ex) when (number1 >50)
   {
      await LohAsync(ex)
      return 1;
   }
   catch (DivideByZeroException ex) when (number1 <50)
   {
      await LogWriteAsync(ex)
      return 0;
   }
   finally
   { 
      await SendAsyncMailAdmin();
   }
}

10 – PARAMETERLESS CONSTRUCTORS IN STRUCTS
Parametre almayan structs kurucular tanımlayamıyorduk fakat C#6.0 ile artık bunu yapabiliyoruz.

struct Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)//Bunu yapabiliyorduk
{
Name = name;
Age = age;
}
public Person() : this(“Jane Doe”, 37) { } // artık bunuda yapabiliyoruz 
}

Alıntılar:
http://testtest2.com/2015/02/c-6-0-ile-gelen-yenilikler/
http://www.borakasmer.com/net-4-6-ile-gelen-yenilikleri-mvcde-inceleyelim/

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s