
Những tính năng mới trong C# 12 mà lập trình viên nên biết
September 28, 2025Phiên bản C# 12 tiếp tục mở rộng khả năng biểu đạt của ngôn ngữ với loạt tính năng mới mạnh mẽ, vừa giúp mã nguồn gọn hơn, vừa mở ra nhiều hướng xử lý linh hoạt hơn trong lập trình hiện đại. Dưới đây là các tính năng nổi bật.
Default Parameters trong Lambda Expressions
Từ C# 12, bạn có thể định nghĩa tham số mặc định cho biểu thức lambda — điều vốn trước đây phải xử lý vòng vèo bằng DefaultParameterValue
. Với cú pháp mới, lambda có thể hoạt động giống như các phương thức thông thường trong việc xử lý tham số tùy chọn.
var myMethod = (int a, int b = 1) => a + b;
var myVar = myMethod(5); // Kết quả là 6
Alias cho bất kỳ kiểu dữ liệu nào bằng “using”
Giờ đây, bạn có thể sử dụng using
để đặt bí danh cho hầu hết các kiểu dữ liệu — bao gồm cả kiểu nullable như float?
. Điều này giúp làm cho mã dễ đọc hơn, đặc biệt trong các dự án lớn với tên kiểu dài dòng.
using OptionalFloat = float?;
using User = (string name, int id);
public void PrintUser(User user) => Console.WriteLine(user.name);
Primary Constructors cho Class và Struct
Nếu bạn từng thích cách khai báo gọn nhẹ với record
trong C# 9, thì chắc chắn bạn sẽ yêu thích cú pháp mới cho constructor trong lớp và struct thông thường. Bạn có thể truyền tham số trực tiếp trong phần định nghĩa lớp và dùng chúng trong các thuộc tính hoặc phương thức bên trong.
public class Post(string title, int upvotes, int downVotes)
{
public string Title => string.IsNullOrWhiteSpace(title) ? "" : title.Trim();
public int Score => upvotes - downVotes;
}
Inline Arrays
C# 12 giới thiệu InlineArray
, một tính năng đặc biệt hữu ích cho các tình huống cần tối ưu hiệu năng. Với cú pháp này, bạn có thể tạo ra các mảng cố định bên trong struct mà không cần khởi tạo riêng biệt.
[System.Runtime.CompilerServices.InlineArray(10)]
public struct MyInlineArray
{
private int _item;
}
var myArray = new MyInlineArray();
for (int i = 0; i < 10; i++) myArray[i] = i;
foreach (var i in myArray)
Console.WriteLine(i);
Collection Expressions và Spread Operator
C# 12 mang đến cú pháp mới để khởi tạo danh sách và mảng một cách tự nhiên và dễ đọc hơn. Đặc biệt, bạn có thể sử dụng ..
để “trải” phần tử từ các mảng/danh sách khác.
int[] a = [1, 2];
int[] b = [3, 4];
int[] c = [..a, ..b];
foreach (var i in c)
Console.WriteLine(i); // Kết quả: 1, 2, 3, 4
Interceptors (Tính năng thử nghiệm)
Interceptors là một trong những tính năng tiên tiến và đang ở trạng thái “preview”. Nó cho phép bạn thay thế phương thức tại thời điểm biên dịch dựa trên vị trí file, dòng và ký tự cụ thể. Đây là tính năng tiềm năng giúp can thiệp vào hành vi mặc định của các phương thức, phù hợp cho các nhà phát triển thư viện hoặc những trường hợp cần thao tác sâu vào luồng thực thi.
Để bật Interceptors, bạn cần kích hoạt trong project file:
<Features>InterceptorsPreview</Features>
Sau đó, bạn có thể sử dụng như sau:
using System.Runtime.CompilerServices;
var myClass = new MyClass();
myClass.SayHello(); // In ra "Hello from the interceptor!"
public class MyClass
{
public void SayHello() => Console.WriteLine("Hello from MyClass");
}
public static class InterceptorClass
{
[InterceptsLocation("Program.cs", line: 8, character: 17)]
public static void InterceptorMethod(this MyClass myClass)
=> Console.WriteLine("Hello from the interceptor!");
}
Tại đây, phương thức SayHello()
gốc đã bị “chặn” và thay thế bằng InterceptorMethod()
nhờ khai báo vị trí chính xác bằng InterceptsLocation
.
C# 12 tiếp tục khẳng định vị thế của mình trong thế giới ngôn ngữ lập trình hiện đại, mang lại các tính năng ngắn gọn, mạnh mẽ và linh hoạt hơn. Từ những cải tiến nhỏ như default parameters trong lambda cho tới các tính năng mang tính nền tảng như primary constructors và collection expressions, mỗi thay đổi đều hướng đến việc giúp lập trình viên viết mã hiệu quả hơn.
Dù một số tính năng như Interceptors vẫn đang trong giai đoạn thử nghiệm, nhưng chúng cho thấy định hướng mạnh mẽ của .NET trong việc hỗ trợ các nhu cầu phát triển ứng dụng phức tạp, quy mô lớn và có thể mở rộng.