04-03-2018, Saat: 00:46
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#:
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