© 2020, Developed by Hieu Dev

C# 11 có những tính năng gì mới?

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.

C#11 có những tính năng gì mới?

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";

Ở đây ta có ký tự $ ở đầu chuỗi báo hiệu nó là một interpolated string. Bên trong chuỗi, thay vì sử dụng placeholder bạn sẽ viết trực tiếp biểu thức cần thiết vào đó.

Hiện tại, C# hỗ trợ hai loại interpolated string như sau:
  • Verbatim interpolated: $@""
  • Non-verbatim interpolated: $""
Một điểm khác biệt chính giữa các chuỗi này là non-verbatim interpolated strings không thể tạo ra newlines, thay vì đó bạn chỉ có thể sử dụng \r\n để tạo newlines. Trong C#11, nó đã được được cải thiện dễ dàng:

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
}

Và bây giờ chúng ta có thể dễ dàng kiểm tra null bằng cách thêm ký tự !! sau parameter name:

public static void M(string s!!)
{
    // Body of the method
}

Điều này sẽ khiến code của bạn ít dài dòng hơn, nhưng thực tế cách này có hữu dụng, và khi người khác đọc code của bạn sẽ như thế nào. Theo mình, đôi khi cái gì nó dài dòng hơn chút vẫn tốt hơn.

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.

Đăng nhận xét

Mới hơn Cũ hơn

TOGETHER

WE GROW