Cùng với sự phát triển của .NET 7, Microsoft cũng phát hành C# 11 với những tính năng vượt trội, cải thiện mạnh mẽ về tính năng và hiệu xuất. Trong bài viết này, chúng ta sẽ xem xét các tính năng mới trong C# 11 và làm sao có thể được sử dụng để cải thiện code của bạn.
Cho phép newlines trong interpolated string
Từ C# 6 đưa ra một cách thức định dạng chuỗi hoàn toàn mới: string interpolation. Chuỗi ký tự được định dạng theo phương pháp này được gọi là interpolated string. Để hiểu rõ hơn về string interpolation, ta có ví dụ sau:
var message = $"My name is {name}. I'm from {town}. I'm {age} years old";
Hiện tại, C# hỗ trợ hai loại interpolated string như sau:
- Verbatim interpolated: $@""
- Non-verbatim interpolated: $""
var v = $"Count ist: { this.Is.Really.Something()
.That.I.Should(
be + able)[
to.Wrap()] }.";
Kiểm tra Null
Trước đó trong C# 10, .Net Team đã giới thiệu một cách mới và rõ ràng hơn để xử lý kiểm tra null. Chúng ta thường sử dụng các if statement để kiểm tra null ví dụ như:
public static void M(string s)
{
if (s is null)
{
throw new ArgumentNullException(nameof(s));
}
// Body of the method
}
public static void M(string s!!)
{
// Body of the method
}
Raw string literals
Raw string literals là một kiểu định dạng mới của string literals. Raw string literals có thể chứa các văn bản tuỳ ý bạn, nó có thể bao gồm whitespace, new lines, dấu ngoặc kép,... Một raw string literal sẽ bắt đầu và kết thúc ba dấu ngoặc kép """. Ví dụ:
string longMessage = """
This is a long message.
It has several lines.
Some are indented
more than others.
Some should start at the first column.
Some have "quoted text" in them.
""";
UTF-8 String Literals
UTF-8 được sử dụng trong nhiều tình huống, đặc biệt là trong các kịch bản web. Trước C# 11, các dev phải dịch UTF-8 sang hệ thập lục phân - dẫn đến mã dài dòng, không thể đọc được, dễ xảy ra lỗi - hoặc mã hóa các ký tự chuỗi trong thời gian chạy.
C# 11 cho phép chuyển đổi các ký tự chuỗi chỉ chứa các ký tự UTF-8 thành byte. Điều này được thực hiện tại thời điểm biên dịch, vì vậy các byte đã sẵn sàng để sử dụng mà không mất thêm thời gian chạy. Vì vậy, bạn có thể viết mã như sau:
byte[] array = "hello"; // new byte[] { 0x68, 0x65, 0x6c, 0x6c, 0x6f }
Span<byte> span = "dog"; // new byte[] { 0x64, 0x6f, 0x67 }
ReadOnlySpan<byte> span = "cat"; // new byte[] { 0x63, 0x61, 0x74 }
List patterns
Trong C# 11, list pattern mới này cho phép bạn match các lists và arrays. Bạn có thể match các phần từ và tuỳ chọn các slice pattern nếu nó match với không hoặc nhiều phần tử.
Cú pháp cho các list patterns là chúng sẽ bắt đầu và kết thúc bằng dấu ngoặc vuông, các slice pattern sẽ thể hiện bằng hai dấu chấm.
Ví dụ, ta có pattern [1, 2, .., 10], và nó sẽ match với các arrays sau:
int[] arr1 = { 1, 2, 10 };
int[] arr1 = { 1, 2, 5, 10 };
int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 };
Generic Attribute
Tính năng custom generic attribute chung này là một tính năng đáng được mong đợi, mặc dù chúng ta đang ở bản preview, một số hạn chế cần được cải thiện sắp tới nhưng hiệu quả nó mang lại thì khỏi phải bàn. Ta có ví dụ sau:
public class FooAttribute<T>:Attribute
{
public T FooProperty {get;set;}
public FooAttribute<T>(T fooValue) => FooProperty = fooValue;
}
Lời kết
Ở trang giới thiệu mới nhất về C# 11 của Microsoft đã chỉ ra những tính năng mới bên trên. Nhưng trong thời gian sắp tới, C#11 này sẽ tiếp tục update với những tính hoàn toàn mới và đáng mong đợi đến với bạn.
Để cập nhật các tính năng mới từ C# 11, các bạn có thể ghé Github repo theo liên kết sau:https://github.com/dotnet/roslyn/blob/main/docs/Language%20Feature%20Status.md
Mong bài viết hữu ích đến với bạn, chúc các bạn thành công!Hieu Ho.