1 poin oleh GN⁺ 2024-08-09 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-08-09
Komentar Hacker News
  • Sudah lama menggunakan discriminated union di F#, dan mengira C# juga memilikinya

    • Sedang menggunakan Java, dan merasa sulit kembali ke bahasa yang tidak memiliki ADT
    • Senang karena tidak perlu lagi meminta maaf atas kurangnya fitur utama di C#
  • Istilah "type union" terasa asing

    • Terlihat mirip dengan tagged union di keluarga bahasa ML
    • Penasaran apakah pengembang C# memang cenderung membuat nama yang berbeda dari istilah yang sudah ada
  • Sebagai pengembang C# lama, merasa use case usulan ini tidak jelas

    • Sepertinya bisa diimplementasikan dengan mendeklarasikan empty interface dan record class
    • Penasaran apakah ada sesuatu yang terlewat
  • TypeScript memiliki type union

    • Terlihat mirip dengan discriminated union di F# atau Haskell
    • Discriminated union memiliki case constructor yang diberi nama
  • Tanpa union yang mendukung pattern matching, pemrograman menjadi lebih sulit

    • Belum sepenuhnya memahami makna expression problem
    • Extension point melalui polimorfisme yang ada mungkin cocok untuk klien di masa depan
    • Untuk kode yang dimiliki tim, union yang mendukung pattern matching lebih cocok
  • Pernah punya pengalaman dengan union C# yang menggunakan field offset

    • Alias nilai pointer/referensi dan nilai biasa dapat memicu undefined behavior
    • Union struct antara u64 dan objek mungkin memerlukan field terpisah sehingga bisa membuang 8 byte
  • Menggunakan constructor privat dan paket nuget agar switch type tidak memerlukan case _

    • Mirip dengan versi desugared dari "union class" yang diusulkan
    • Bagus jika paket nuget menjadi tidak perlu dan ditambahkan syntactic sugar
  • Tidak disebutkan bagaimana union struct menangani tearing saat dimodifikasi secara bersamaan

    • Tearing dapat menimbulkan masalah keamanan memori
    • Mungkin ada varian yang memiliki field integer dan field referensi pada offset yang sama