C# 12 ve .NET 8'deki Bazı Yeni Özellikler, Muhtemelen ASP.NET Core Geliştirmelerinde Kullanacaksınız

Paylaş :

.NET 8 ve C#'ın Kasım 2023'teki yayını, ASP.NET Core proje geliştirmesini devrim niteliğinde değiştiren gelişmiş özellikleri ve iyileştirmeleri tanıtması bakımından önemli bir dönemeçtir.

C# 12 ve .NET 8'deki Bazı Yeni Özellikler, Muhtemelen ASP.NET Core Geliştirmelerinde Kullanacaksınız

Bu yazı, ASP.NET Core geliştirmemizi iyileştirebilecek yeni C# 12 ve .NET 8 özelliklerini keşfedecektir.

#1 Birincil Oluşturucular (Primary Constructors) Birincil oluşturucuların kullanımı, sınıf oluşturucularını daha basit ve daha temiz bir şekilde bildirmeyi mümkün kılar.

// C#12 Önce
public class UserService : IUserService
{
    private readonly IUserRepository _userRepository;
    private readonly ILogger _logger;

    public UserService(IUserRepository userRepository, ILogger logger)
    {
        _userRepository = userRepository;
        _logger = logger;
    }
}


// C#12
public class UserService(IUserRepository userRepository, ILogger logger) : IUserService
{
    private readonly IUserRepository _userRepository = userRepository;
    private readonly ILogger _logger = logger;
} 


#2 Toplama İfadeleri (Collection Expressions) Toplama ifadelerini kullanarak, koleksiyonları başlatmanın alternatif bir yolunu benimseyebiliriz.

//  C#12 Önce
List<User> users = new List<User>();
// veya
var users = new List<User>();
// veya
List<User> user = new();


// C#12
List<User> users = [];

// Initializing list with values:
List<User> users = 
[
    new User { Username = "user1" },
    new User { Username = "user2" }
]; 

Diziyi başlatmak şimdi daha basit hale geldi:  

// C#12 Önce
string[] statusCodes = new string[] { "SUCCESS""WARNING""DANGER"};

// C#12
string[] statusCodes = ["SUCCESS""WARNING""DANGER"]; 

#3 Varsayılan Lambda Parametreleri (Default Lambda Parameters) 

Lambda ifadeleri, bir yöntemin içinde basit bir görevi gerçekleştirmek üzere bir fonksiyon oluşturmaya izin verir.

Varsayılan lambda parametreleri, lambda ifadesinde parametre için varsayılan değeri eklememize olanak tanır.

// Before C#12
var getFullName = (string firstName, string lastName) => string.Join(" ", firstName, lastName);
var fullName1 = getFullName("Uzeyir""");
var fullName2 = getFullName("Uzeyir""Aydın");


// C#12
var getFullName = (string firstName, string lastName = "") => string.Join(" ", firstName, lastName);
var fullName1 = getFullName("Uzeyir "); // lastName parameter is optional
var fullName2 = getFullName("Uzeyir ""Aydın ");

#4 Herhangi Bir Türü Takma Adlandırma (Alias Any Type) 

Deklarasyonları daha basit ve temiz hale getirmek için bir koleksiyon türüne takma ad verebiliriz: 

// En üstteki using ifadesi
using Users = System.Collections.Generic.List<User>;

public Users GetUsers()
{
    return
    [
        new User { Username = "user1" },
        new User { Username = "user2" }
    ];
}


Eğer bir yöntemin birden fazla değer döndürmesini istiyorsak ancak bir sınıf oluşturmaya üşeniyorsak, aynı tuple deklarasyonlarını azaltmak için bir tuple'a takma ad verebiliriz:

// En üstteki using ifadesi  
using Person (string FirstName, string LastName);

public Person Get()
{
    return ("Üzeyir""Aydın");
}

public List<Person> GetAll()
{
    return 
    [
        ("Üzeyir ""Aydın "), 
        ("Murat""Bekleviş")
    ];
}  

#5 Deneysel Öznitelik (Experimental Attribute) 

Deneysel veya riskli özelliklere bir işaret olarak hizmet eden bir özniteliği kullanarak bu özelliklere etiket koyabiliriz. Bu özniteliği belirli bir özellik veya kod bloğuna uygulayarak, ilişkili işlevin değerlendirmeye tabi olduğunu ve gelecekteki güncellemelerde değişebileceğini veya kaldırılabileceğini belirtiriz.

[Experimental("Feature07")]
public void DeleteAllProducts()
{
    _context.Database.ExecuteSqlRaw("DELETE FROM Products");
} 

Deneysel özelliği çağırmak, derleme hatasına neden olacaktır.  

// Derleme hatası! 
_productService.DeleteAllProducts(); 

Deneysel özelliği çağırmak için derleme hatasını bastırmamız gerekiyor:

#pragma warning disable Feature07
_productService.DeleteAllProducts();
#pragma warning restore Feature07 


#6 İç içe Diziler (Inline Arrays) 

Bu özellik özel ve muhtemelen pek kullanılmayabilir. Ancak, iç içe diziler bazı belirli senaryolarda performansı artırabilir.  

using System.Runtime.CompilerServices;

[InlineArray(5)]
public struct MyArray<T>
{
    // we don't need this field, but the compiler does
    private T _element;
} 

Onu normal bir dizi gibi kullanabiliriz:

var users = new MyArray<User>();

for (int i = 0; i < 5; i++)
{
    users[i] = new User();
}

foreach (var user in users)
{
    Console.WriteLine(user.FirstName + " " + user.LastName);
}  


#7 Ham Dize Simgeleri (Raw String Literals) 

Ham dize simgeleri özelliği C# 11 ve .NET 7'de tanıtıldı. Bununla ilgili olarak bazılarımız .NET 7'yi atlayabilir ve doğrudan .NET 8'e geçebilir, bu nedenle bu özelliği listeye ekledim.

Bunu SQL sorgusunu yazmak için kullanabiliriz:  

var minPrice = 100;
var maxPrice = 1000;

var query = $"""
    SELECT *
    FROM Products
    WHERE Price > {minPrice} and Price < {maxPrice}
    ORDER BY Price DESC
"
"";

Aynı zamanda JSON dizesini de yazmak için kullanabiliriz:

var id = 1;
var firstName = "Üzeyir";
var lastName = "Aydın";

var json = $$"""
    {
        "
id": "{{id}}",
        "
firstName: "{{firstName}}",
        "lastName""{{lastName}}"
    }
"""; 

Hesabınızı yönetmek için giriş yapın

veya