Proposal Resmi Type Unions untuk C#
(github.com/dotnet)Ringkasan
Dokumen ini mengusulkan type union (atau discriminated union) di C#.
Motivasi
- Dalam pengembangan perangkat lunak, nilai yang disimpan dalam sebuah variabel tidak selalu harus berupa jenis yang sama.
- Misalnya, ketika definisi pelanggan dan pemasok hanya berbagi sebagian properti, mungkin perlu menjalankan operasi serupa terhadap kedua tipe tersebut.
- Hal ini bisa diselesaikan melalui pewarisan, tetapi tidak cocok untuk semua situasi.
- C# membutuhkan cara untuk menyimpan sejumlah terbatas tipe yang berbeda dalam variabel yang sama.
- Bahasa lain sudah menyediakan kemampuan seperti ini.
Solusi
- Cara yang paling tepat untuk mengimplementasikan union type di C# dapat dipandang sebagai hierarki yang menggunakan abstract base class.
- Namun, ada masalah seperti batasan hierarki dan ketidakmampuan mengekspresikan union dari tipe-tipe yang tidak saling terkait.
- Bisa jadi diperlukan beberapa jenis union, dan proposal ini mengelompokkannya ke dalam empat kategori.
Standar - Union Class
Deklarasi
- Union class dideklarasikan mirip dengan enum.
- Setiap anggota dapat memiliki variabel status.
Pembuatan
- Dibuat dengan menetapkan instance dari tipe anggota.
Penguraian
- Diuraikan melalui type test dan pattern matching.
Exhaustiveness
- Jika semua tipe anggota sudah dipertimbangkan dalam ekspresi atau pernyataan switch, kasus default tidak diperlukan.
Nullability
- Dapat menyertakan null dengan menggunakan notasi nullability standar.
Implementasi
- Union class diimplementasikan sebagai abstract record class.
Spesialisasi - Union Struct
Deklarasi
- Dideklarasikan mirip dengan union class, tetapi dengan penambahan keyword struct.
Pembuatan
- Dibuat dengan menetapkan instance dari tipe anggota.
Penguraian
- Diuraikan melalui type test dan pattern matching.
Exhaustiveness
- Jika semua tipe anggota sudah dipertimbangkan dalam ekspresi atau pernyataan switch, kasus default tidak diperlukan.
Nullability
- Dapat menyertakan null dengan menggunakan notasi nullability standar.
Nilai default
- Union struct dapat berada dalam keadaan tidak terdefinisi saat belum diberi nilai atau saat diberi nilai default.
Implementasi
- Union struct diimplementasikan sebagai struct, dan tipe anggotanya diimplementasikan sebagai nested record struct.
Sementara - Union Ad Hoc
Sintaks
- Union ad hoc direferensikan menggunakan sintaks pola
or.
Penamaan
- Alias using tingkat file atau global dapat digunakan untuk memberi nama umum pada union ad hoc.
Pembuatan
- Dibuat dengan menetapkan instance dari tipe anggota.
Penguraian
- Diuraikan melalui type test dan pattern matching.
Exhaustiveness
- Jika semua tipe anggota sudah dipertimbangkan dalam ekspresi atau pernyataan switch, kasus default tidak diperlukan.
Nullability
- Dapat menyertakan null dengan menggunakan notasi nullability standar.
Interchangeability
- Union ad hoc dengan tipe anggota yang sama dapat saling dipertukarkan.
User-defined Union
- Dapat mendeklarasikan union type yang tidak bisa dinyatakan sebagai union class atau union struct.
- Hierarki dapat ditutup dengan menggunakan atribut
Closed. - Dapat diimplementasikan sebagai wrapper struct dengan menggunakan atribut
Union.
Union Umum
Option
- Merupakan struct union yang merepresentasikan nilai yang mungkin ada atau mungkin tidak ada.
Result
- Merupakan struct union yang mengembalikan hasil sukses atau error dari sebuah fungsi.
Proposal Terkait
Hierarki tertutup
- Mendeklarasikan himpunan subtype tertutup pada abstract base type dengan menggunakan atribut
Closed.
Nilai singleton
- Tipe dengan atribut singleton dapat digunakan sebagai nilai dalam konteks non-type.
Singkatan anggota bertingkat
- Dapat melakukan binding ke anggota statis atau nested type dari target type dengan menggunakan nama yang tidak terikat.
Ringkasan GN⁺
- Dokumen ini mengusulkan type union di C#, serta menyediakan cara untuk menyimpan beberapa tipe dalam satu variabel di berbagai situasi.
- Ini adalah upaya untuk menghadirkan kemampuan yang sudah disediakan oleh bahasa lain ke dalam C#.
- Hal ini dapat membantu pengembang meningkatkan keterbacaan dan kemudahan pemeliharaan kode.
- Contoh bahasa lain yang menyediakan kemampuan serupa adalah F#.
1 komentar
Komentar Hacker News
Sudah lama menggunakan discriminated union di F#, dan mengira C# juga memilikinya
Istilah "type union" terasa asing
Sebagai pengembang C# lama, merasa use case usulan ini tidak jelas
TypeScript memiliki type union
Tanpa union yang mendukung pattern matching, pemrograman menjadi lebih sulit
Pernah punya pengalaman dengan union C# yang menggunakan field offset
Menggunakan constructor privat dan paket nuget agar switch type tidak memerlukan case
_Tidak disebutkan bagaimana union struct menangani tearing saat dimodifikasi secara bersamaan