
5 Syntax mới trong C#11 và .Net 8.0
September 21, 2025C# không chỉ là ngôn ngữ ổn định – nó luôn phát triển! Và ở phiên bản 11, ngôn ngữ này tiếp tục mang đến nhiều tính năng mới mẻ mà mọi lập trình viên nên biết. Trong bài viết này, chúng ta sẽ cùng điểm qua một số tính năng nổi bật của C# 11 giúp code trở nên dễ viết, dễ đọc và dễ bảo trì hơn.
1. Raw String Literal – Chuỗi thô dễ nhìn, dễ viết
Đây là một trong những tính năng thú vị nhất của C# 11. Với raw string literal, bạn có thể viết chuỗi nhiều dòng, bao gồm cả dấu ngoặc kép và nội suy chuỗi, mà không cần phải lo lắng về việc escape hay nối chuỗi phức tạp.
Cách cũ – nối chuỗi thủ công
string desc = "my name is john doe."
+ "I am a software engineer."
+ "I love c#";
Cách mới – raw string literal
string desc = """
my name is john doe.
I am a software engineer.
I love c#
""";
Thậm chí bạn có thể nội suy chuỗi ngay trong raw string:
string end = ".";
string desc = $"""
"I love c#{end}"
""";
2. Local Function – Hàm trong hàm
C# cho phép bạn định nghĩa một hàm ngay bên trong một hàm khác. Điều này cực kỳ tiện lợi khi bạn muốn chia nhỏ logic phức tạp trong một phương thức mà không cần phải tạo hàm riêng ở cấp lớp.
public string Statistics(params int[] nums)
{
int Mean() => nums.Sum() / nums.Count();
double Average() => nums.Average();
return $"The mean is {Mean()}, average is {Average()}";
}
Kết quả là phương thức của bạn trở nên ngắn gọn, dễ đọc và dễ bảo trì hơn.
3. List Pattern – So khớp danh sách
Tính năng pattern matching trong C# ngày càng mạnh mẽ. Với C# 11, bạn có thể so khớp một mảng hoặc danh sách theo mẫu cụ thể:
int[] nums = { 1, 2, 3 };
bool check = nums is [1, 2, 3]; // true
bool check2 = nums is [1, ..]; // true - phần tử đầu là 1, sau đó là bất kỳ
bool check3 = nums is [0 or 1, ..]; // true nếu phần tử đầu là 0 hoặc 1
4. Record – Kiểu dữ liệu bất biến cực tiện dụng
record
là kiểu tham chiếu giúp bạn lưu trữ và truyền dữ liệu theo cách bất biến (immutable), rất phù hợp để sử dụng làm DTO trong các ứng dụng.
Cách khai báo cơ bản:
public record Profile(string Fname, string Lname);
var p = new Profile("John", "Doe");
Console.WriteLine(p); // Output: Profile { Fname = John, Lname = Doe }
Bạn cũng có thể định nghĩa required
property với init
để tăng tính an toàn và rõ ràng:
public record Profile
{
public required string Fname { get; init; }
public string Lname { get; init; }
}
var p = new Profile { Fname = "John", Lname = "Doe" };
Nếu không khởi tạo thuộc tính được đánh dấu required
, trình biên dịch sẽ báo lỗi. Điều này rất hữu ích cho các trường hợp cần xác minh dữ liệu.
5. Switch Expression – Cú pháp ngắn gọn và mạnh mẽ
Câu lệnh switch
trong C# không còn nhàm chán. Với cú pháp switch expression
, bạn có thể xử lý nhiều nhánh logic một cách ngắn gọn và dễ đọc hơn:
Level = (maths_score, english_score) switch
{
(>= 50, >= 50) => nameof(ClassLevel.First),
(< 50, < 50) => nameof(ClassLevel.Second),
_ => throw new NotImplementedException()
};
Gợi ý thêm: Guard Clause trong .NET 8
Nếu bạn đã mệt mỏi với những khối if
lồng nhau hay try-catch
rối rắm, tính năng guard clause trong .NET 8 có thể sẽ là người bạn đồng hành lý tưởng để đơn giản hóa việc kiểm tra điều kiện ngay từ đầu.
C# 11 mang đến nhiều cải tiến thực tế giúp code dễ viết, dễ đọc và đáng tin cậy hơn. Dù bạn là người mới học C# hay đã có kinh nghiệm lâu năm, việc cập nhật các tính năng này sẽ giúp bạn làm việc hiệu quả và hiện đại hơn.