C# 6
C# 6 ile birlikte .NET platformunun ana dili olan C# programlama diline gelen using static, exception filters, await, nameof, null operator, auto-initialize ile ilgili bilgiler yer alıyor.
Static imports
C# 6 ile birlikte gelen using static anahtar kelimesi static olarak tanımlanan metot ve özelliklere sınıf adını yazmadan kullanmaya imkan verir.
using System;
class Program {
public static void Main(string[] args) {
double sqrt = Math.Sqrt(144);
string str = String.Concat("yusufsezer", ".com");
Console.WriteLine(sqrt);
Console.WriteLine(str);
}
}
Math ve String sınıfı içerisinde yer alan statik metotları sınıf adını yazarak ulaştık.
using System;
using static System.Math;
using static System.String;
class Program {
public static void Main(string[] args) {
double sqrt = Sqrt(144); // Sınıf adı kullanmadık
string str = Concat("yusufsezer", ".com"); // Sınıf adı kullanmadık
Console.WriteLine(sqrt);
Console.WriteLine(str);
}
}
Math ve String sınıfını using static anahtar kelimesiyle dahil ederek sınıf içerisinde yer alan metotlara doğrudan erişim sağladık.
Exception filters
Exception filters özelliği birden fazla istisnanın yer aldığı kod bloklarında filtreleme yaparak sadece koşula uyan istisnanın catch bloğunun çalışmasını sağlar.
Özelliğin kullanımı aşağıdaki gibidir.
catch (Exception e) when (e.ParamName == "?"){ }
Örnek kullanım aşağıda yer almaktadır.
using System;
class Program {
public static void Main(string[] args) {
try {
int[] a = new int[3];
a[5] = 10;
throw new Exception("Özel bir hata");
} catch(Exception e) when(e.GetType().ToString() == "System.IndexOutOfRangeException"){
Console.WriteLine("Dizin taşma hatası.");
} catch(Exception e) when(e.Message == "Özel bir hata"){
Console.WriteLine("Özel bir hata oluştu.");
}
}
}
Örnekte görüldüğü gibi hatanın içeriğine göre özel bir catch bloğunun çalıştırılmıştır.
Await in catch/finally blocks
C# 5 ile birlikte gelen await ve async asenkron olarak belirtilen bir metodun çalıştırılması için kullanılan anahtar kelimedir.
using System;
using System.Threading.Tasks;
class Program {
public static void Main(string[] args) {
Metot();
}
async static Task Metot() {
try {
int[] a = new int[3];
a[5] = 10;
} catch {
await AsenkronMetot();
} finally {
await AsenkronMetot2();
}
}
async static Task AsenkronMetot() {
Console.WriteLine("AsenkronMetot çalıştırıldı.");
}
async static Task AsenkronMetot2() {
Console.WriteLine("AsenkronMetot2 çalıştırıldı.");
}
}
C# 6 ile birlikte await anahtar kelimesinin kullanım alanı genişletilerek catch ve finally içerisinde de kullanılabilir hale geldi.
Auto-property initializers
C# içerisinde yer alan property oldukça kullanılmakta ancak başlangıç değeri vermek için kurucu metot kullanılması gerekliydi.
C# 6 ile birlikte property özelliklerine başlangıç değeri atamak auto-initialize özelliği ile daha kolay hale geldi.
using System;
class Person {
public Guid Id { get; set; } = Guid.NewGuid();
public string FirstName { get; set; } = "Yusuf";
public string LastName { get; } = "Sezer"; // Default values for getter-only properties
}
class Program {
public static void Main(string[] args) {
Person p = new Person();
Console.WriteLine(p.Id);
Console.WriteLine(p.FirstName);
Console.WriteLine(p.LastName);
}
}
Bu özellik sayesinde sınıf kurucusuna ihtiyaç olmadan başlangıç değeri atayabildik.
Özellike sadece getter işlecine sahip property için Default values for getter-only properties özelliğini sağlar.
Expression bodied members
C# 6 ile birlikte gelen Expression-bodied members özelliği ile içeriği tek satır olan metot ve property özelliklerini daha kolay yazma imkanı getirildi.
using System;
class Person {
public Guid Id { get; } = Guid.NewGuid();
public string FirstName { get; } = "Yusuf";
public string LastName { get; } = "Sezer";
public void FullName() => Console.WriteLine(FirstName +" "+ LastName);
}
class Program {
public static void Main(string[] args) {
Person p = new Person();
p.FullName();
}
}
Örnekte görüldüğü üzere tek satır içeren metodu daha kolay bir şekilde yazmış olduk.
Null propagator
C# 6 ile birlikte null veya boş değere sahip nesneleri karşılaştırmak ve değer atamak için ?., ?[] ve ?? operatörleri eklenmiştir.
using System;
class Person {
public Guid Id { get; } = Guid.NewGuid();
public string FirstName { get; } = "Yusuf";
public string LastName { get; } = "Sezer";
public void FullName() => Console.WriteLine(FirstName +" "+ LastName);
}
class Program {
public static void Main(string[] args) {
Person p = new Person();
p?.FullName();
Person p1 = null;
p1?.FullName();
// aşağıdaki ifade ile aynı anlama gelir
if(p1 != null) {
p1.FullName();
}
}
}
Boş nesneleri karşılaştırmak için ?? operatörü de kullanılabilir.
using System;
class Person {
public Guid Id { get; } = Guid.NewGuid();
public string FirstName { get; } = "Yusuf";
public string LastName { get; } = "Sezer";
public void FullName() => Console.WriteLine(FirstName +" "+ LastName);
}
class Program {
public static void Main(string[] args) {
Person p = new Person();
var guid = p?.Id ?? Guid.NewGuid();
Console.WriteLine(guid);
}
}
İlk olarak p nesnesini null kontrolü yapar eğer null değilse Id nesnesini kontrol eder Id nesnesi null ise Guid.NewGuid(); değilse p.Id değeri guid değişkenine atanır.
String interpolation
C# 6 ile birlikte gelen string interpolation özelliği yazı biçimlendirme işlemini daha kolay bir şekilde yapılmasını sağlar.
Genel kullanım aşağıdaki gibidir.
$"<text> {<interpolated-expression> [,<field-width>] [<:format-string>] } <text> ..."
Bu özelliği yukarıda yer alan metodun sonucunda kullanalım.
using System;
class Person {
public string FirstName { get; } = "Yusuf";
public string LastName { get; } = "Sezer";
public string FullName() => $"{FirstName} {LastName}";
}
class Program {
public static void Main(string[] args) {
Person p = new Person();
Console.WriteLine(p.FullName());
}
}
Örnekteki işlemi String.Format metodu ile de yapabilirdik ancak bu kullanım daha anlaşılabilir görünüyor.
Nameof operator
C# 6 ile birlikte gelen nameof operatörü parametre olarak aldığı değerin adını almak için kullanılır.
using System;
class Program {
public static void Main(string[] args) {
Console.WriteLine(nameof(Main));
Console.WriteLine(nameof(Program));
Console.WriteLine(nameof(System.Threading.Tasks));
}
}
Belki kullanımı anlamsız görünse de istisna yönetiminde kullanılan metotların kayıt altına alınmasında faydalı olacaktır.
Dictionary initializer
C# 6 ile birlikte .NET içerisindeki Dictionary koleksiyonu için değer atama işlemi daha kolay hale gelmiştir.
using System;
using System.Collections.Generic;
class Program {
public static void Main(string[] args) {
Dictionary<int, string> dictionary = new Dictionary<int, string>() {
{1, "Yusuf"},
{2, "Ramazan"},
{3, "Sinan"},
{4, "Mehmet"},
};
foreach (KeyValuePair<int, string> kv in dictionary) {
Console.WriteLine($"{kv.Key}.{kv.Value}");
}
}
}
Örneklerde görüldüğü üzere C# 6 ile birlikte birçok yararlı özellik eklenerek daha az kod yazarak, daha anlamlı ve daha işlevsel geliştirme yapmaya imkan vermektedir.
C# 6 ile gelen özellikleri roslyn derleyicisi ile kullanabilirsiniz.
.NET Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.