C# 15 mang đến một nâng cấp tập trung cho các biểu thức collection: đối số biểu thức collection thông qua phần tử mở đầu with(...).
Nếu bạn đã sử dụng biểu thức collection của C# 12, tính năng này giải quyết một điểm bất tiện phổ biến: giờ đây bạn có thể truyền các đối số theo kiểu constructor hoặc factory trực tiếp bên trong [...].
Mục lục
So sánh nhanh C# 12, C# 13 và C# 15
| Phiên bản | Thay đổi | Điều không thay đổi |
|---|---|---|
| C# 12 | Bổ sung biểu thức collection ([...]) và phép trải rộng (..). |
Không có cách nội tuyến để truyền đối số constructor hoặc factory. |
| C# 13 | Mở rộng collection được dùng với params cho tham số phương thức. |
Không thay đổi cú pháp tạo collection bằng biểu thức collection. |
| C# 14 | Không có thay đổi về biểu thức collection. | |
| C# 15 | Thêm with(...) làm phần tử đầu tiên trong biểu thức collection. |
Không cho phép mảng hoặc span nhận các đối số collection. |
Hãy ghi nhớ rõ sự khác biệt này:
- C# 13 cải thiện hình thức của tham số phương thức thông qua collection
params. - C# 15 cải thiện cú pháp tạo collection bằng
with(...)trong[...].
Ôn lại: C# 12 đã giới thiệu gì?
C# 12 mang đến biểu thức collection:
int[] values = [1, 2, 3];
int[] all = [0, ..values, 4];
Điều này giúp việc khởi tạo collection dễ đọc hơn, nhưng vẫn chưa cho phép bạn truyền trực tiếp các tùy chọn như capacity, comparer hoặc factory.
Ôn lại: C# 13 đã giới thiệu gì?
C# 13 mở rộng từ khóa params để hoạt động với nhiều kiểu collection hơn, không chỉ mảng:
// params nay chap nhan Span<T>, ReadOnlySpan<T> va cac interface collection
public void LogValues(params Span<int> numbers) { ... }
LogValues(1, 2, 3); // Hoat dong tuong tu
C# 15 bổ sung gì cho biểu thức collection?
Trong C# 15, một biểu thức collection có thể bắt đầu bằng with(...):
List<int> numbers = [with(capacity: 100), 1, 2, 3, ..more];
with(...) cung cấp các đối số cho việc tạo collection trong những trường hợp được hỗ trợ, chẳng hạn như liên kết constructor, builder Create(...) và các chữ ký interface được hỗ trợ.
Quy tắc cú pháp: with(...) phải đứng đầu
Hợp lệ:
[with(capacity: 100), ..items]
Không hợp lệ:
[..items, with(capacity: 100)]
Ví dụ thực tế
1. Định kích thước trước cho collection để thể hiện rõ ý định
List<int> ids = [with(capacity: 256), ..sourceIds];
Cách này giữ toàn bộ thao tác khởi tạo trong một biểu thức và làm cho ý định của bạn trở nên rõ ràng.
2. Các trường hợp sử dụng collection builder
Đối với collection builder, C# 15 hỗ trợ các tham số bổ sung cho Create(...) ở trước tham số ReadOnlySpan<T> cuối cùng.
Cấu trúc khái quát:
static MyCollection<T> Create(SomeOption option, ReadOnlySpan<T> items)
Cách sử dụng:
Tags tags = [with(StringComparer.OrdinalIgnoreCase), "CSharp", "CSHARP", "csharp", "dotnet"];
Tags newTags = [with(), "CSharp", "CSHARP", "csharp", "dotnet"];
Tags oldTags = ["CSharp", "CSHARP", "csharp", "dotnet"];
[CollectionBuilder(typeof(Tags), nameof(Create))]
internal sealed class Tags(string[] values, StringComparer comparer) : HashSet<string>(values, comparer)
{
public static Tags Create(StringComparer comparer, ReadOnlySpan<string> items) => new([.. items], comparer);
public static Tags Create(ReadOnlySpan<string> items) => new([.. items], StringComparer.OrdinalIgnoreCase);
}
Giới hạn và điểm cần lưu ý
Mảng và span nằm ngoài phạm vi hỗ trợ
Nếu kiểu đích là mảng hoặc span, with(...) không được hỗ trợ.
Không cho phép đối số dynamic
Các đối số bên trong with(...) không được có kiểu dynamic.
with(...) không ảnh hưởng đến suy luận kiểu hoặc chuyển đổi
Theo thiết kế, các đối số trong with(...) được bỏ qua khi quyết định chuyển đổi và suy luận kiểu. Quy tắc này tương đồng với tiền lệ của new(...).
Các quy tắc thông thường về overload và sự mơ hồ vẫn được áp dụng
Việc phân giải overload của constructor và builder vẫn được thực hiện như thông thường. Nếu có nhiều ứng viên phù hợp, tình trạng mơ hồ vẫn có thể xảy ra.
Vì sao đối số biểu thức collection của C# 15 quan trọng?
C# 15 cải thiện việc khởi tạo collection trong một biểu thức bằng cách cho phép:
- Thể hiện ý định rõ ràng hơn, chẳng hạn như capacity, tùy chọn hoặc các đầu vào tương tự comparer khi được hỗ trợ.
- Giảm số lượng câu lệnh khởi tạo tách rời.
- Sử dụng API gọn gàng hơn với các collection builder tùy chỉnh.
Danh sách kiểm tra khi áp dụng
- Sử dụng
with(...)khi ý định rõ ràng, chẳng hạn để chỉ định capacity hoặc các tùy chọn. - Không sử dụng với mảng hoặc span vì chúng chưa được hỗ trợ.
- Ghi nhớ rõ mô hình phiên bản:
- C# 13 = hình thức gọi với
params. - C# 15 = hình thức tạo collection.
- C# 13 = hình thức gọi với
- Kiểm tra các API constructor hoặc builder có khả năng gây mơ hồ trong chính các kiểu của bạn.
Kết luận
Đối số biểu thức collection của C# 15 là một bước phát triển có mục tiêu từ biểu thức collection của C# 12: vẫn sử dụng mô hình [...], nhưng nay có thêm with(...) ở phần tử đầu tiên để truyền đối số cho constructor, builder hoặc interface đích.
Trên thực tế, tính năng này giúp việc khởi tạo trở nên rõ ràng và giàu tính biểu đạt hơn, đồng thời giảm số lượng câu lệnh. Tuy vậy, nó vẫn tuân theo các giới hạn: chỉ được đặt ở phần tử đầu tiên, không chấp nhận dynamic và không hỗ trợ mảng hoặc span.
Tài liệu tham khảo
© 2003 – 2026 Laurent Kempé. Bảo lưu mọi quyền.
Những quan điểm được trình bày là quan điểm cá nhân của tác giả và không phản ánh quan điểm của đơn vị tuyển dụng hoặc bất kỳ tổ chức bên thứ ba nào.



