Đề xuất chính thức về Type Unions trong C#
(github.com/dotnet)Tóm tắt
Đây là tài liệu đề xuất type union (hoặc discriminated union) cho C#.
Động lực
- Khi phát triển phần mềm, giá trị được lưu trong một biến không phải lúc nào cũng cùng một loại.
- Ví dụ, khi định nghĩa khách hàng và nhà cung cấp chỉ chia sẻ một phần thuộc tính, có thể cần thực hiện các thao tác tương tự với cả hai kiểu.
- Có thể giải quyết bằng kế thừa, nhưng không phù hợp với mọi tình huống.
- C# cần một cách để lưu một số lượng hữu hạn các kiểu khác nhau trong cùng một biến.
- Các ngôn ngữ khác đã cung cấp tính năng này.
Giải pháp
- Cách phù hợp nhất để hiện thực union type trong C# có thể được xem là một hệ phân cấp dùng abstract base class.
- Tuy nhiên, cách này có các vấn đề như ràng buộc của hệ phân cấp, hoặc không thể biểu diễn union của các kiểu không liên quan.
- Có thể cần nhiều loại union khác nhau, và đề xuất này phân chúng thành bốn danh mục.
Tiêu chuẩn - Union class
Khai báo
- Union class được khai báo tương tự như
enum. - Mỗi member có thể có biến trạng thái.
Tạo
- Được tạo bằng cách gán một instance của kiểu member.
Phân rã
- Được phân rã thông qua kiểm tra kiểu và pattern matching.
Tính bao quát
- Nếu mọi kiểu member đều được xét trong biểu thức hoặc câu lệnh
switch, thì không cần case mặc định.
Khả năng null
- Có thể bao gồm
nullbằng cách dùng ký hiệu khả năng null tiêu chuẩn.
Triển khai
- Union class được triển khai dưới dạng abstract record class.
Chuyên biệt hóa - Union struct
Khai báo
- Được khai báo tương tự union class, nhưng thêm từ khóa
struct.
Tạo
- Được tạo bằng cách gán một instance của kiểu member.
Phân rã
- Được phân rã thông qua kiểm tra kiểu và pattern matching.
Tính bao quát
- Nếu mọi kiểu member đều được xét trong biểu thức hoặc câu lệnh
switch, thì không cần case mặc định.
Khả năng null
- Có thể bao gồm
nullbằng cách dùng ký hiệu khả năng null tiêu chuẩn.
Giá trị mặc định
- Union struct có thể ở trạng thái chưa xác định khi chưa được gán hoặc khi được gán giá trị mặc định.
Triển khai
- Union struct được triển khai dưới dạng struct, còn các kiểu member được triển khai dưới dạng nested record struct.
Tạm thời - Union tạm thời
Cú pháp
- Union tạm thời được tham chiếu bằng cú pháp pattern
or.
Đặt tên
- Có thể dùng file hoặc global
usingalias để gán một tên chung cho union tạm thời.
Tạo
- Được tạo bằng cách gán một instance của kiểu member.
Phân rã
- Được phân rã thông qua kiểm tra kiểu và pattern matching.
Tính bao quát
- Nếu mọi kiểu member đều được xét trong biểu thức hoặc câu lệnh
switch, thì không cần case mặc định.
Khả năng null
- Có thể bao gồm
nullbằng cách dùng ký hiệu khả năng null tiêu chuẩn.
Tính thay thế cho nhau
- Các union tạm thời có cùng các kiểu member thì có thể thay thế cho nhau.
Union do người dùng định nghĩa
- Có thể khai báo các union type không thể biểu diễn bằng union class hoặc union struct.
- Có thể đóng hệ phân cấp bằng thuộc tính
Closed. - Có thể triển khai bằng struct wrapper với thuộc tính
Union.
Union phổ biến
Option
- Đây là một struct union biểu diễn một giá trị có thể tồn tại hoặc không tồn tại.
Result
- Đây là một struct union dùng để trả về kết quả thành công hoặc lỗi từ hàm.
Các đề xuất liên quan
Hệ phân cấp đóng
- Dùng thuộc tính
Closedđể khai báo một tập hợp kiểu con đóng cho abstract base type.
Giá trị singleton
- Kiểu có thuộc tính singleton có thể được dùng như giá trị trong ngữ cảnh không phải kiểu.
Rút gọn member lồng nhau
- Có thể dùng tên chưa được bind để bind tới static member hoặc nested type của target type.
Tóm tắt của GN⁺
- Tài liệu này đề xuất type union cho C#, cung cấp cách lưu nhiều kiểu trong biến ở nhiều tình huống khác nhau.
- Đây là nỗ lực đưa vào C# một tính năng mà các ngôn ngữ khác đã hỗ trợ.
- Nó có thể giúp lập trình viên cải thiện độ dễ đọc và khả năng bảo trì của mã.
- F# là một ví dụ về ngôn ngữ khác có tính năng tương tự.
1 bình luận
Ý kiến trên Hacker News
Đã từng dùng discriminated union trong F# và nghĩ rằng C# cũng phải có
Thuật ngữ "type union" nghe khá lạ
Với tư cách là một lập trình viên C# lâu năm, cảm thấy trường hợp sử dụng của đề xuất này chưa rõ ràng
TypeScript có type union
Nếu không có union hỗ trợ pattern matching thì việc lập trình trở nên khó khăn
Đã từng có kinh nghiệm với union trong C# dùng field offset
Dùng constructor riêng tư và gói nuget để kiểu switch không cần case
_Không thấy đề cập union struct sẽ xử lý tearing thế nào khi bị sửa đổi đồng thời