§  Out Anahtar Kelimesi

§  Pattern Matching

§  Switch Expression

§  Yerel Fonksiyonlar

§  Tuples

§  Binary Literal

§  Metotların Ref Döndürmesi

§  Throw Expression

 

Yerel Fonksiyonlar

C# 7 ile birlikte fonksiyon içinde fonksiyon tanımlayabilmemizin önü açıldı. Bu sayede artık yerel fonksiyonlar tanımlayabileceğiz.

 

public int fonksiyon1(int sayi1,int sayi2)

    {

        int fontsiyon(int sayi)

        {

                sayi++;

            return sayi*=sayi;

        }

     

        return fonksiyon(sayi1)+sayi2;

    }

 

Binary Literal

Bu özellikle birlikte sayısal ifadeler binary olarak tanımlanabilecek. Aynı zaman da digit ayraçlarıyla büyük sayıları binary veya heksadesimal olarak ayırabileceğiz. Bu daha kolay okuma da sağlayacaktır.

int sayi1 = 2_000_123;

int sayi2 = 0x3EEE_1111;

int sayi3 = 0b0001_1100_1111_0000;

var d = 123_456;

var x = 0xAB_CD_EF;

 

Metotların Ref Döndürmesi

Metotlara C# programlama dilinde ref değer gönderebiliyorduk. C# 7 ile beraber metotlar ref değeri de döndürebilecek. bu Referans tipi olarak dönmektedir.

public ref int Bul(int sayi, int[] sayilar)
{
    for (int i = 0; i < sayilar.Length; i++)
    {
        if (sayilar[i] == sayi) 
        {
            return ref sayilar[i]; 
        }
    }
    thrownew IndexOutOfRangeException($"{nameof(sayi)} bulunamadı!");
}

 

 

Out Anahtar Kelimesi

Out anahtar kelimesini kullanarak daha önce metotlara parametre geçirebiliyorduk. Out parametresi birden çok değer döndürmek istediğinizde oldukça popüler bir kullanıma sahiptir. bildiğiniz gibi out parametresi referans tipidir ve bir argüman olarak çalışmaktadır. Fakat out parametreye geçireceğiniz değişkeni daha önce tanımlamanız gerekmektedir.  C# 7 ile birlikte out parameteresi olarak değişkenleri aynı anda tanımlayabiliyoruz.

publicvoid KooridnatCiz(Point p)
{
    p.GetCoordinates(out int lang, out int long);
    WriteLine($"({lang}, {long})");
}

 

Out parametresinde değişken tanımlanın yanında var tipi değiştekde tanımlayabilirsiniz. Değişkenin kullanıdığı zaman sadece sınırlı kapsam içerdiğini dolayısıyla bunları metotun dışında kullanamayacağınızı unutmayın. Değişkeni doğrudan argüman olarak tanımlayabildiğimiz için C# 7 bunlarıda da var değer olarak tanımlamamıza izin verir. Dolayısıyla hangi tip değişken tanımladım diye kontrol yapmanıza gerek kalmaz. bildiğiniz gibi var tipi değişkenler dönüşebilmektedir.

 

p.KooridnatCiz(out var lang, out var long);

 

Pattern Matching

is anahtar kelimesi ile Pattern Matching özelliğini kullanabiliriz. Örneğin bir type pattern yaparak çalışma zamanında tipe göre işlem yapabiliriz.

publicvoid deneme(object o)
{
    if (o isnull) return;     // sabit pattern "null"
    if (!(o isint sayi)) return; // tip pattern "int sayi"
    WriteLine(new string('*', sayi));
}

 

Switch Expression

switch-case yapısı daha önceki c# programlama dili versiyonlarında oldukça sınırlıydı. Artık daha kompleks yapılar kurabiliyor ve null kontrolü, sınıf kullanımı gibi özellikleride switch- case yapımızda kullanabiliyoruz.

Örnek 1:

switch(sekil)

{

    case Daire c:

        WriteLine($"circle with radius {c.Radius}");

        break;

    case Ucgen s when (s.Length == s.Height):

        WriteLine($"{s.Length} x {s.Height} kare");

        break;

    case Ucgen r:

        WriteLine($"{r.Length} x {r.Height} üçgen");

        break;

    default:

        WriteLine("bilinmeyen şekil");

        break;

    casenull:

        thrownew ArgumentNullException(nameof(sekil));

}

 

Örnek 2:

public static int deneme(IEnumerable<object> values)

{

    var toplam = 0;

    foreach (var item in values)

    {

        switch (item)

        {

            case int val:

                toplam += val;

                break;

            case IEnumerable<object> altListe:

                toplam += deneme(altListe);

                break;

        }

    }

    return toplam;

}

Tuples

Tuples kullanımı eski bir kullanım olmasına rağmen c# 7 ile yenilenerek gelmiştir. tuple type ve tuple literal bir yenilik olarak karşımıza çıkmaktadır. Tuple tipleri değer tipi değişkenlerdir. System.Tuple isim alanını kullanmaktadır. Birden fazal değer döndürmek için Tuple kullanabilirsiniz. Birden fazla parametre olsa dahi tek nesne olarak işlem görmektedir. Çoklu değer döndürmek için out paramtresi tercih etmeden değer döndürebilirsiniz.

( string, string, string, string) getKisi()

{

    //Kişi bilgilerini veritabanından veya başka bir kaynaktan okuyabilirsiniz

    string strIsim = "Volkan";

    string strAdres = "Kadıköy";

    string strSehir= "İstanbul";

     return(strIsim, strAdres, strSehir); // tuple literal

}

 

//aşağıdaki metotu çağırdınızda çoklu değerleri döndürecektir.

 var kisiBilgi= getKisi();

WriteLine("Kisi bilgi:  {kisiBilgi .Item1} {kisiBilgi .Item2} {kisiBilgi .Item3}");

 

Yukarıdaki örnekte çoklu değerleri tuple kullanarak kolayca elde edebiliyoruz. Fakat item1,item2 isimleri alakası ve kafa karıştırıcıdır. bu yüzden anlamlı isimler kullanarak aşağıdaki örneği inceleyelim.

 

(string strIsim, string strAdr, string strSe) getKisi()

{

    //kodlarınızı buraya yazıyorsunuz

}

 

//metotu belirlenmiş ismi ile çağırdığınız zaman değerler aşağıda gözükecektir

var kisiBilgi= getKisi();

WriteLine("kisi bilgi: {kisiBilgi.strIsim} {kisiBilgi.strAdr} {kisiBilgi.strSe} ");

 

Bunlara ek olarak tüm değerleri Tuple Literal olarakta döndürebilirsiniz.

return (strIsim: strIsim, strAdr: strAdres, strSe: strSehir);

Tuple Hash tablosu veya Dictionary kullanarak kolayca değiştirebileceğiniz ve döndürebileceğiniz bir sisteme sahiptir. Tek durumda birden fazla değeri depoladığınız List yerinede kullanabilirsiniz. .NET üstünde bir Tuple tip tanımlıdır. Bu referans tipi bir değişkendir. C#ile gelen değiştirilebilir değer türü Tuple ise daha performanslıdır.

Bazı zamanlarda tüm tuple paketine ulaşmadan sadece değerlerine ihtiyacınız olabilir. O zaman C# 7 ile gelen Deconstruction özelliğini kullanarak istediğiniz parçayı oradan çekip alabilirsiniz.

( string strIsim,  string strAdr,  string strSe) = getKisi();

Console.WriteLine($"Adres: { strAdr }, Şehir: { strSe }");

 

Throw Expression

Bir try-catch yapısının herhangi bir yerinde throw kullanabilirsiniz. C# 7 ile istediğiniz bir yerde throw fırlatabilirsiniz.

class Kisi

{

    public string isim { get; }

    public Kisi(string isim_) => Name = isim_ ?? throw new ArgumentNullException(isim_);

    public string ilkismigetir()

    {

        var parts = isim.Split(" ");

        return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("isim yok!");

    }

    public string sonismigetir() => throw new NotImplementedException();

}