Merih Forum Programlama ve yazılım algoritmalar programlama c# c++ C# 8.0 İle Gelebilecek Muhtemel Yenilikler

ABD Münbiçi bırakır mı ?

ABD, Münbiçin yarısı sizde yarısı bizde kalsın dedi

SON 20 YILDA OSCAR KAZANAN KADINLAR

Son 20 yılda En İyi Kadın Oyuncu kategorisinde Oscar kazanan oyuncuların listesi...

AFRİN HAREKATI

Zeytin Dalı Harekatında teröristlerden temizlenen bölge artıyor

SILKROAD XIAN SERVER

2017 de açılan Xian server ilginç özelliklerde

  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
C# 8.0 İle Gelebilecek Muhtemel Yenilikler

 
#1

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#:
Kod:
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#:
Kod:
string toDoList;
toDoList = null;// Derlemede uyarı alınır

Null olabilir tanımlaması daha en baştan aşağıdaki gibi yapılabilir.
C#:
Kod:
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#:
Kod:
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#:
Kod:
string toDoList = GetTodoList();
if(toDoList != null) // Hate alınmaz
{
   Console.WriteLine(toDoList.Length);
}

C#:
Kod:
string toDoList = GetTodoList();
Console.WriteLine(toDoList?.Length); // Bu şekilde bir tanımlama ile compiler'a null değil ise tanımlaması yapılabilir.

C#:
Kod:
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#:
Kod:
class Person(string FirstName, string LastName);

Aşağıdaki kodlardan umarım ilerde kurtulmuş olucağız [img=22x22]data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7[/img]
C#:
Kod:
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#:
Kod:
interface IMail {
   void SendMail();

   void SendMailAll(IEnumberable<Customerlist> customerList){
      foreach(var i in customerList)
      {
             //// Yolla Gitsin....
      }
  }
}

C#:
Kod:
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 [img=22x22]data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7[/img]

C#:
Kod:
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#:
Kod:
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#:
Kod:
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 [img=22x22]data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7[/img]

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#:
Kod:
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



Ara
Cevapla


[-]
Hızlı Cevap

İnsan Doğrulama:
Aşağıda görünen onay kutusunu işaretleyiniz. Bu işlem otomatik spam kayıtları önlemek için kullanılır.

Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


Konuyu Okuyanlar:
1 Ziyaretçi

   
Türkçe Çeviri: MCTR, Forum Yazılımı: MyBB, © 2002-2018 MyBB Group.  



Merih Forum® bilgi paylaşım platformu. 2015-2018 Tüm hakları saklıdır.