C# 8.0 İle Gelebilecek Muhtemel Yenilikler

Gelebilecek yenilikleri beğendiniz mi?


  • Kullanılan toplam oy
    10

Bu konuyu okuyanlar

Samet UCA

Müdavim
Katılım
3 Ağustos 2012
Mesajlar
3,277
Reaksiyon puanı
2,912
Puanları
113
Bu makalede C# 8.0 ile gelmesi muhtemel özellikleri hep beraber inceleyeceğiz. Halen tartışılıyor. İlerde bunların bir kısmı kaldırılabilir. Ya da yenileri de eklenebilir.

1-) Non-Nullable & Nullable Reference Tipleri: Burada yapılmak istenen “NullReferenceExceptions?” hatasından mümkün olduğunca kurtulmaktır. Mesela “string” değişkenler daha en baştan null olabilir ya da olamaz şekilde tanımlanması planlanmaktadır.

  • “T? where T is a value type” ==> Bu şekilde tanımlama hali hazırda zaten yapılabilmektedir.
  • “T? where T is a reference type” ==> Ama reference tipinde bir değişken null olarak henüz atanamamaktadır.
C# 8.0 ile bir refence tipi, bu şekilde tanımlandığı zaman null olamaz anlamına gelmekte ve aşağısındaki atama ile derleme anında uyarı alınması planlanmaktadır.
C#:
string! toDoList;
toDoList = null;// Derlemede uyarı alınır
Ayrıca stringlerin default değer olarak da artık “null” değer kabul edilmemesi planlanmaktadır.
C#:
string toDoList;
toDoList = null;// Derlemede uyarı alınır
Null olabilir tanımlaması daha en baştan aşağıdaki gibi yapılabilir.
C#:
string? toDoList;
toDoList = null;// Derlemede uyarı alınmaz
Bu şekilde bir tanımlama ile derleme anında yine toDoList’in null olamaz şeklinde tanımlanması ve GetTodoList() methodunun null dönmesi yüzünden derleme anında uyarı alınacaktır.
C#:
public string? GetTodoList()
{
    return null;
}

string toDoList;
toDoList = GetTodoList(); // Uyarı alınır
Aşağıdaki şekillerde yapılabilecek kontrollerin, daha derleme zamanında uyarılar (warning)’ler ile yapılması planlanmaktadır. Bu şekilde gözden kaçabilecek null hatalarının daha derleme zamanında önüne geçilmek istenmektedir.
C#:
string toDoList = GetTodoList();
if(toDoList != null) // Hate alınmaz
{
    Console.WriteLine(toDoList.Length);
}
C#:
string toDoList = GetTodoList();
Console.WriteLine(toDoList?.Length); // Bu şekilde bir tanımlama ile compiler'a null değil ise tanımlaması yapılabilir.
C#:
string? toDoList = null; //
if (string.IsNullOrWhiteSpace(toDoList))
{
    Console.WriteLine(toDoList!.Length); //toDoLİST'in null olmayacağı garanti edilmiştir :)
}

2-) Records (C# 8.0) : Sıra geldi benim favorime. Sınıfları daha en başta aşağıdaki gibi Constructer kullanmadan ilgili propertyleri ile hızlıca tanımlama.

C#:
class Person(string FirstName, string LastName);
Aşağıdaki kodlardan umarım ilerde kurtulmuş olucağız :)
C#:
class Person: IEquatable<Person>
{
    public string FirstName { get; }
    public string LastName { get; }

    public Person(string FirstName, string LastName)
    {
        this.FirstName = FirstName;
        this.LastName = LastName;
    }
}

3-) Default Interface : Aşağıdaki örnekte IMail interface’inde tanımlı “SendMailAll()” methodu, c# 8.0 ile artık mutlaka implemente edilmek zorunda değildir. Default olarak ilgili method zaten interface içinde tanımlanmıştır.

C#:
interface IMail {
    void SendMail();

    void SendMailAll(IEnumberable<Customerlist> customerList){
       foreach(var i in customerList)
       {
              //// Yolla Gitsin....
       }
   }
}
C#:
class Mail : IMail { } // OK

IMail _mail = new Mail();
_mail.SendMailAll(); // Tüm mailler gider...

4-) Asynchronous Enumerables : Aşağıda görüldüğü gibi asenkron olarak dönen bir listede mesela Twitter entegrasyonunda, twit atan kişiler sayfaya asenkron olarak listelenmek istendiğinde C# 8.0’da böyle bir yapı planlanmaktadır. Bence çok güzel olur. Umarım biran evel gelir :)

C#:
IAsyncEnumerable<TwitterResult> results =
    twitterMessageEngine.GetAllResults(query);

foreach await (var result in results) { // ... }

5-) Asynchronous Dispose (C# 8.0) :

Diyelim ki bir windows yani masaüstü uygulamanız DB ile direk bağlantılı işler yapıyor. 1 milyon kaydın üzerinde transection içinde bir işlem yaparken eğer bir hata oluşur ise, bunları rollback ile geri almak çok vakit alabilir ve windows uygulamanızın donmasına sebebiyet verebilir.

Aşağıdaki yöntem ile bu durum hali hazırda çözülebilir.

C#:
IDbTransaction transaction = null;

try
{
    transaction = connection.BeginTransaction();

    // İstediğin gibi kodla ...

    transaction.Commit();
}
finally
{
    await Task.Run(() => transaction.Dispose());
}

Ya C# 8.0 ile aşağıdaki gibi bir çözüme gitsek daha kısa olmaz mı?

C#:
using await (var transaction = connection.BeginTransaction())
{
    // İstediğin gibi kodla ...

    transaction.Commit();
}

6-) Extension Everything :

Bir sınıfın çalışma yapısını bozamadan extensionlar ile ona bir takım özellikler eklemek. Kulağa hiç de fena gelmiyor dimi :)

Aşağıdaki kodlar BUILD 2017 konuşmasından alınmıştır. Ve sadece yapılması planlanmaktadır. Bir çeşit yol haritası diyebiliriz. Görüldüğü gibi Person sınıfının yapısı bozulmadan, statick bir field, method(), property ve hatta constructer bile tanımlanmıştır. Bu şekilde bu sınıfı kullanan diğer kod parçaları, hiçbir şeyden etkilenmeden çalışmaya devam edebileceklerdir.

C#:
extension Enrollee extends Person
{
    // static field
    static Dictionary<Person, Professor> enrollees =
        new Dictionary<Person, Professor>();

    // instance method
    public void Enroll(Professor supervisor) =>
        enrollees[this] = supervisor;

    // instance property
    public Professor Supervisor =>
        enrollees.TryGetValue(this, out var supervisor)
            ? supervisor
            : null;

    // static property
    public static ICollection<Person> Students => enrollees.Keys;

    // instance constructor
    public Person(string name, Professor supervisor)
        : this(name)
    {
        this.Enroll(supervisor);
    }
}

Bence en güzel yanı, planlanan bu yeni geliştirmelerin şefaf ve açık olması. Siz de GitHub’daki Roslyn projesine giderseniz ve gerçekten akla yatkın bir yöntemle konuya yaklaşırsanız, bir sonraki C# sürümüne yön verebilirsiniz.

Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hoşçakalın.

İlgili Video’yu burdan izleyebilirsiniz ==> A Preview of C# 8 with Mads Torgersen

Burdan da C#8.0 için bilgi edinebilirsiniz. ==> C# 8.0 Features

Bu makale sahibi Bora Kaşmerden izin alınarak paylaşılmıştır.
Kaynak ve daha fazla ayrıntı için ==> www.borakasmer.com
Makaleyi farklı bir platformda paylaşmadan önce lütfen izin alınız.
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
567
Puanları
93
Merhaba,

çok güzel bilgiler vermişsiniz. Elinize sağlık.

Saygılarımla
 

Samet UCA

Müdavim
Katılım
3 Ağustos 2012
Mesajlar
3,277
Reaksiyon puanı
2,912
Puanları
113
Merhaba,

çok güzel bilgiler vermişsiniz. Elinize sağlık.

Saygılarımla
Teşekkür ederim. Takip ettiğim bir yazılımcının makalesini kaynak göstererek alıntı yaptım. Bu sayede buradaki arkadaşlarda bilgi alabilir :)
 

Brynquadel

Asistan
Katılım
15 Kasım 2016
Mesajlar
125
Reaksiyon puanı
49
Puanları
28
Yaş
25
Çok güzel yenilikler bildiğim kadarıyla bu özellikler .Net ile geliyor.
@SametUCA değil mi? Değilse açıklarsan sevinirim, iyi forumlar.
 

Mtn S

Onursal Üye
Emektar
Katılım
16 Ocak 2017
Mesajlar
23,347
Reaksiyon puanı
15,350
Puanları
113
Her ne kadar çok bilgim olmasada :D harika bir yenilik olduğuna inanıyorum öyle görüyorum emekleriniz için teşekkürler ederiz :)
 

Samet UCA

Müdavim
Katılım
3 Ağustos 2012
Mesajlar
3,277
Reaksiyon puanı
2,912
Puanları
113
Çok güzel yenilikler bildiğim kadarıyla bu özellikler .Net ile geliyor.
@SametUCA değil mi? Değilse açıklarsan sevinirim, iyi forumlar.
Framework yukseltilmesi esas onemli bir konu. Program dili guncelleme demek .Net framework’u guncelleme demek.
 

Brynquadel

Asistan
Katılım
15 Kasım 2016
Mesajlar
125
Reaksiyon puanı
49
Puanları
28
Yaş
25
Framework yukseltilmesi esas onemli bir konu. Program dili guncelleme demek .Net framework’u guncelleme demek.
Core ne oluyor o zaman? (Araştırma yapmadan soruyorum bağışlayın) içerisinde ayrı dil mi barındırıyor yoksa olan dili farklı bir şekilde mi yönetiyor?
 

Samet UCA

Müdavim
Katılım
3 Ağustos 2012
Mesajlar
3,277
Reaksiyon puanı
2,912
Puanları
113
Core ne oluyor o zaman? (Araştırma yapmadan soruyorum bağışlayın) içerisinde ayrı dil mi barındırıyor yoksa olan dili farklı bir şekilde mi yönetiyor?
.NET Core, Windows, Linux ve MacOS üzerinde çalışabilen (cross-platform), Microsoft ve GitHub üzerinde Community tarafından desteklenen Open Source bir geliştirme platformu. Farklı bir dil derken çalışma mantığı CLR şeklinde yani
.NET de kütüphanelerle program kodu derlenip Microsoft Intermediate Language (Microsoft Ara dili)ne çevrilir. Burada oluşturulan Assembly CLR tarafından herhangi bir sistemde çalıştırılabilir. IL kodu JIT derleyicileri tarafından makina diline çevrilip çalıştırılır.
 

ProgramBoy

Asistan
Katılım
2 Şubat 2021
Mesajlar
183
Reaksiyon puanı
119
Puanları
43
Yaş
48
C# ve Java gibi derlenen diller, her yeni versiyonda scripting dilleri gibi pratikleşiyor.
 

Samet UCA

Müdavim
Katılım
3 Ağustos 2012
Mesajlar
3,277
Reaksiyon puanı
2,912
Puanları
113
Evet özellikle .net ekibi iyi çalışıyor. Kullanıcıların geri dönüşlerinede cevap veriyorlar her yeni versiyonda.
 
Üst