C# 7

.NET platformunun ana dili olan C# diline C# 7 ile birlikte gelen Pattern matching, Tuples, Local functions, Digit separator, Binary literals, Out vars ile ilgili bilgiler yer alıyor.

C# 7 ile gelen özelliklere bakmadan önce C# 6 ile gelen özelliklere buradan bakabilirsiniz.

Pattern matching

C# 7 ile birlikte değer kontrolünü daha az komut ile yaparak değişkene atayan pattern matching özelliği gelmiştir.

using System;

class Person {
    public Guid Id { get; } = Guid.NewGuid();
    public string FirstName { get; } = "Yusuf";
    public string LastName { get; } = "SEZER";
}

class Program {

    public static void Main(string[] args) {
        Person yusuf = new Person();
        Yazdir(yusuf);
    }

    public static void Yazdir(object nesne) {
        if(nesne is null)
            Console.WriteLine("Nesne null");
        else if(nesne is Person p)
            Console.WriteLine($"{p.FirstName} {p.LastName}");
        else
            Console.WriteLine("Nesne tanımlanamadı.");
    }
}

Örnekte görüldüğü üzere eşleşen değişkenin değeri if içerisinde atanmıştır.

using System;

class Person {
    public Guid Id { get; } = Guid.NewGuid();
    public string FirstName { get; } = "Yusuf";
    public string LastName { get; } = "SEZER";
}

class Program {

    public static void Main(string[] args) {
        Person yusuf = new Person();
        //object deger = yusuf;
        object deger = 1453;

        switch(deger) {
            case int sayi:
                Console.WriteLine("int, değer = " + sayi);
            break;
            case true:
            case false:
                Console.WriteLine("bool");
            break;
            case Person p when p.FirstName =="Yusuf":
                Console.WriteLine("Hoşgeldin Yusuf");
            break;
            case Person p:
                Console.WriteLine("person");
            break;
            default:
                Console.WriteLine("Bulunamadı");
            break;
        }
    }
}

Örnekte görüldüğü üzere switch yapısı pattern matching ile daha yetenekli hale gelmiş.

Tuples

C# içerisinde yer alan tuple kullanımı C# 7 ile birlikte daha da geliştirilmiştir.

using System;

class Program {

    public static void Main(string[] args) {
        Tuple<int, string, string> yusuf = new Tuple<int, string, string>(1, "Yusuf", "SEZER");
        Console.WriteLine($"{yusuf.Item1} {yusuf.Item2} {yusuf.Item3}");

        var sonuc = Bilgiler();
        Console.WriteLine($"{sonuc.Item1} {sonuc.Item2} {sonuc.Item3}");
    }
    
    public static (int, string, string) Bilgiler() {
        return (1, "Yusuf", "SEZER");
    }
}

Tuple sayesinde class veya struct tanımına ihtiyaç duymadan verileri saklayan bir tür tanımlamış olduk.

Böylece tuple özelliği ile bir den fazla değer döndüren metotlar tanımlayabildik.

Deconstruction

Sınıf içerisinde yer alan özelliklere sınıf.ozellik olarak erişim sağlıyoruz.

Deconstruction özelliği ile sınıf içerisindeki özelliklere doğrudan erişim sağlayabiliriz.

using System;

class Person {
    public Guid Id { get; } = Guid.NewGuid();
    public string FirstName { get; } = "Yusuf";
    public string LastName { get; } = "SEZER";

    public void Deconstruct(out string FirstName, out string LastName) {
        FirstName  = this.FirstName;
        LastName = this.LastName;
    } 
}

class Program {

    public static void Main(string[] args) {
        var(FirstName, LastName) = new Person();
        Console.WriteLine($"{FirstName} {LastName}");
    }
}

Örnekte görüldüğü üzere Deconstruct metodu ile sınıf içerisinde yer alan değerleri out ile dışarı aktarmış olduk.

Local functions

C# 7 ile birlikte gelen local functions veya yerel fonksiyon özelliği ile metot, özellik ve tanımlanan yerel fonksiyonun içerisinde fonksiyon tanımlamamıza imkan verir.

using System;

class Program {

    public static void Main(string[] args) {
        int sonuc = Topla(10, 20);
        Console.WriteLine($"Sonuç: {sonuc}");

        int Topla(int s1, int s2) => s1 + s2;  // lambda functions
    }
}

Bu özellik sayesinde sadece tek bir metot içerisinde kullanılan fonksiyon, metot içerisinde tanımlanarak karmaşıklığını önlemektedir.

Digit separator

C# 7 ile birlikte gelen digit separator özelliği ile uzun sayıları daha okunabilir yazabiliriz.

using System;

class Program {

    public static void Main(string[] args) {
        int i = 1_00_000;
        double f = 1_00_000;
        Console.WriteLine(i);
        Console.WriteLine(f);
    }
}

Binary literals

C# 7 ile gelen binary literals özelliği ile ikilik sayı sisteminin kullanımı daha kolay hale geldi.

using System;

class Program {

    public static void Main(string[] args) {
        int a = 0b1010;
        int b = 0b1010_1111_01010;
        int c = 0x00A;
        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
    }
}

Ref returns and locals

C# 7 ile birlikte ref anahtar kelimesinin kullanımı daha da genişletilmiştir.

using System;

class Program {

    public static void Main(string[] args) {
        int [] sayilar = {1, 2, 3};
        Yazdir(sayilar);
        ref int bulunanSayi = ref SayiBul(sayilar, 3);
        Console.WriteLine($"Sayı bulundu değeri: {bulunanSayi}");
        bulunanSayi = 1453;  // bulunan sayı değiştirildi.
        Yazdir(sayilar);
    }

    public static ref int SayiBul(int[] sayilar, int arananSayi) {
        for(int i = 0; i < sayilar.Length; i++)
            if(sayilar[i] == arananSayi)
                return ref sayilar[i];
        throw new Exception("Sayı bulunamadı.");
    }

    public static void Yazdir(int[] sayilar) {
        foreach(int sayi in sayilar)
            Console.WriteLine(sayi);
    }
}

Ref returns özelliği ile bulunan değerin referansıyla değerini değiştirdik.

using System;

class Program {

    public static void Main(string[] args) {
        int [] sayilar = {1, 2, 3};
        Console.WriteLine(sayilar[1]);
        
        ref int sayi = ref sayilar[1];
        sayi = 1453;
        Console.WriteLine(sayilar[1]);
    }
}

Benzer şekilde sınıf içerisinde yer alan değerleri referans ile değiştirdik.

C# içerisinde yer alan ref ile ilgili bilgi almak için C# ref ve out yazıma bakabilirsiniz.

Expression bodied

C# 6 ile birlikte gelen expression bodied özelliği genişletilerek getter, setter, kurucular ve yıkıcılar içinde kullanılabilir hale geldi.

using System;

class Person {
    public Guid Id { get; } = Guid.NewGuid();
    public string FirstName { get; } = "Yusuf";
    public string LastName { get; } = "SEZER";
    public Person(string firstname, string lastname) => (FirstName, LastName) = (firstname, lastname);
    public void Yazdir() => Console.WriteLine($"{FirstName} {LastName}");
    ~Person() => Console.WriteLine("Nesne silindi.");
}

class Program {

    public static void Main(string[] args) {
        Person sinan = new Person("Sinan", "SEZER");
        sinan.Yazdir();
    }
}

C# 6 ile gelen özelikler için C# 6 yazıma bakabilirsiniz.

Out vars

C# 7 öncesinde int, double, DateTime gibi veri türlerine ait TryParse metodu için önceden değişken tanımlayıp kullanıyorduk.

C# 7 ile birlikte artık değişken tanımını metot kullanımı ile yapabiliriz.

using System;

class Program {

    public static void Main(string[] args) {
        // C# 7 öncesi
        string tarihimiz = "01-01-2000";
        DateTime tarih;
        if(DateTime.TryParse(tarihimiz, out tarih)) {
            Console.WriteLine(tarih);
        }

        // C# 7
        if(DateTime.TryParse(tarihimiz, out DateTime tarih1)) {
            Console.WriteLine(tarih1);
        }
    }
}

Throw expressions

C# 7 ile birlikte istisnaların oluşturulması daha kolay hale geldi.

using System;

class Person {};

class Program {

    public static void Main(string[] args) {}

    // C# 7 öncesi
    public static void BirHataVar(Person person) {
        if(person == null)
            throw new ArgumentNullException();
        Person p = person;
    }
    
    // C# 7
    public static void YeniBirHataVar(Person person) {
        Person p = person ?? throw new ArgumentNullException();
    }
}

Discards

C# 7 ile birlikte gelen discards özelliği kullanılmayan değişkenleri iptal etmek için kullanılır.

Örneğin aşağıdaki gibi bir kullanımda tarih değerine ihtiyacımı yok ancak kullanabiliyoruz.

using System;

class Program {

    public static void Main(string[] args) {
        string tarihimiz = "01-01-2000";
        if(DateTime.TryParse(tarihimiz, out DateTime tarih)) {
            Console.WriteLine("Doğru bir tarih.");
        }
        Console.WriteLine(tarih);
    }
}

Uzun komutlarda bunun gibi komutlar birden fazla değişkenin oluşmasına ve komutların karışmasına neden olur.

Değişkeni iptal etmek için _ kullanmak yeterli olacaktır.

using System;

class Program {

    public static void Main(string[] args) {
        string tarihimiz = "01-01-2000";
        if(DateTime.TryParse(tarihimiz, out DateTime _)) {
            Console.WriteLine("Doğru bir tarih.");
        }
    }
}

Son

C# 7 ile birlikte gelen özellikler daha az kod yazarak daha fazla işlem yapmayı ve fonksiyonel programlama dillerinde yer alan özellikleri getirmiştir.

Ayrıca C# 7.0 sürümünden sonra gelen 7.1, 7.2, 7.3 sürümleri ile 7.0 sürümündeki özelliklere yeni özellikler eklenmiştir.

C# 7 ile gelen özellikleri roslyn derleyicisi ile kullanabilirsiniz.

.NET Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!