C# 6.0 Yenilikleri

7.11.14 Tuğrul Emre Atalay 1 Comments



C#'ın günümüzün en nitelikli ve kullanışlı dillerinden biri olduğu kesin. Bir süre önce yapılan Build'de C# 6.0'ın yeni özellikleri tanıtıldı. Ve karşınızda bu özellikler;

Null-Conditional Operator


"Null kontrolü şart" mantığıyla projerlerin vazgeçilmezi olan if(value!=null) ifadesi yerine kontrolü ve işi tek satırda bitiren null kontrollü şartlı yapı yeniliklerden biri.

Kullanım:

Eski;

if(value!=null)
item = value.Substring(0,value.Lenght-5);

Yeni;

item = value?.Substring(0,value.Lenght-5);

Auto-Property Initializers


Default değeri olması gereken bir property'nin değerini genelde constructor ya da ilk set ediliş için çağıracağımız bir method'da atardık. Ancak Auto-Property Initializer ile bu işi property tanımında

halledebiliyoruz.

Eski;

public DateTime TimeVal { get; set;}

public void SetFirst()
{
TimeVal = DateTime.Now;
...
}

Yeni;

public DateTime TimeVal { get; set;} = DateTime.Now;
public DateTime TimeValue { get;} = DateTime.UtcNow; //Asıl kullanım amacı read-only property'ler.

Primary Constructors


Constructor'da parametre olarak alınan değerlerin class içerisindeki property'e eşitlenme işi parametrelerin direk class'a verilmesi ve auto-property initializer kullanılarak eşitlenmesi ile daha basit bir

hal almış.

Eski;

public class MathPro
{
public MathPro(string name,int id)
{
this.Name = name;
this.ID = id;
...
}

public string Name {get;set;}
public int ID {get;set;}

}

Yeni;

public class MathPro(string name,int id)
{
public string Name {get;set;} = name;
public int ID {get;set;} = id;
...
}

Expression Bodied Functions and Properties


Bazı az iş yapan method'lar için statement body açmak her zaman gereksiz gelmiştir. Bu yenilik ile az iş yapıp hak etmeyen method'a küme parantezi aç kapa yok. Hatta sadece method'lar için

değil basit getter setter'ı olmayan property'ler için de geçerli.

Eski;

//MathPro class'ı için
public override string ToString()
{
return this.Name + this.ID.ToString();
}

public string NewText
{
get{return string.Format("{0} - {1}", ID.ToString(), Name);}
 }

Yeni;

public override string ToString() => this.Name + this.ID.ToString();
public string NewText=>
  string.Format("{0} - {1}", ID.ToString(), Name);

Indexed Members and Element Initializers


Belirli index ya da key'deki elemanların değerlerini atama işi için önce collection'ı tanımlar daha sonra değeri atardık. Yeni özelliklerden biri de tanımlama içinde index ya da key kullanarak değer

atanabilmesi. Ayrıca $ sembolü ilgili index ya da parametreye erişimi sağlıyor.

Eski;

Dictionary<string, string> ExDictionary = new Dictionary<string, string>();

List<double> ExList = new List<double>()
  {
0,0,0,0,0,20,0,0,0,0,40
  };

public void SetFirst()
{
ExDictionary.Add("En","400px");
}

public void EditData(string newData)
{
    ExDictionary["En"]= newData;
    ExList[10] = ( ExList[10] *2 / 5);
}

Yeni;

Dictionary<string, string> ExDictionary = new Dictionary<string, string>()
  {
    ["En"] = "400px"],
    ["Boy"] = "800px"]
  };

List<double> ExList = new List<double>()
  {
    [5] = 20,
    [10] = 40
  };

public void EditData(string newData)
{
    ExDictionary.$En= newData;
    ExList.$10 = ( ExList.$10 *2 / 5);
}


Static Using Statements


Bu özellik biraz ilginç olmuş, kafa karıştıracak gibi. Using define kısmında belirtilen bir class'ın static method'unu kullanırken class ismi yazmaya gerek kalmayacak.

Eski;

using System.Windows.Media;

public class ExMedia
{
public ExMedia()
{
Color.FromArgb(10,20,30,40);
...
}
}

Yeni;

using System.Windows.Media.Color;

public class ExMedia
{
public ExMedia()
{
FromArgb(10,20,30,40);
...
}
}

Declaration Expressions


Bu özellik "Kullanımından önce değişkeni tanımla" ile doğan gereksiz bir satır kodu öldürüyor. Özellikle try metodları içinde kullanılan out değişkenler için nimet.

Eski;

//WP Navigasyon Parametresi Alımı
protected override void OnNavigatedTo(NavigationEventArgs e)
{
double vol = 0;
this.NavigationContext.QueryString.TryGetValue("vol", out vol);
}

Yeni;

protected override void OnNavigatedTo(NavigationEventArgs e)
{
this.NavigationContext.QueryString.TryGetValue("vol", out double vol);
}

Exception-Handling Improvements


Try-Catch yapısında await method kullanılamamasına herhalde bir tek ben gıcık olmuyorumdur. Buna framework geliştiricilerinden bir abimiz de gıcık olmuş ki kullanıma olanak sağlamış. Ayrıca

exception handling'e filtreleme de eklenmiş.

Yeni;

public void DoSmhtng()
{
 try
{
string text = string.Empty;
                using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    using (IsolatedStorageFileStream stream = file.OpenFile("mediastate.txt", FileMode.Open, FileAccess.Read))
                    {
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            text = reader.ReadToEnd();
                            reader.Close();
                        }
                        stream.Close();
                    }
                }
}
catch(IsolatedStorageException ex) if (!string.IsNullOrEmpty(ex.HelpLink))
{
await Log(ex.HelpLink);
}

Additional Numeric Literal Formats


Bu özellik sayesinde decimal, hex ve binary verilerde görülen yazım tipi etkinleştirildi.

Yeni;

int number = 2_147_483_647;


C# 6.0 ile gelen ya da gelebilecek olan bazı özellikleri MSDN'den ve Filip abimizin anlatımından derleyerek sizlere anlatmak istedim. Umarım yanlış anladığım ya da anlattığım bir kısım yoktur, varsa da bana da öğretiniz.

İyi C#'lar.

1 yorum:

  1. Teşekkürler.

    Genel olarak Javascript/TypeScript etkileri görülüyor. Güzel değişiklikler var, ancak Primary Constructors başlığındaki kullanım biraz çirkin bence. Constructor içine kod yazmadan gelen parametreleri aynı isimlerdeki property'lere atasaymış daha hoş olurmuş. :)

    YanıtlaSil

En kısa zamanda yorumunuz yayınlanacaktır.

Teşekkür ederiz.