C# için Type Unions Resmî Önerisi
(github.com/dotnet)Özet
Bu, C# için type union'ları (veya discriminated union'ları) öneren bir belgedir.
Motivasyon
- Yazılım geliştirirken bir değişkende saklanan değerler her zaman aynı türden olmayabilir.
- Örneğin müşteri ve tedarikçi tanımları yalnızca bazı özellikleri paylaşıyorsa, bu iki tip üzerinde benzer işlemler yapmak gerekebilir.
- Bu, kalıtım yoluyla çözülebilir, ancak her durum için uygun değildir.
- C#'ta sınırlı sayıdaki farklı tipleri aynı değişkende saklayabilmenin bir yoluna ihtiyaç vardır.
- Diğer diller bu özelliği zaten sunmaktadır.
Çözüm
- C#'ta union type'ları uygulamanın en uygun yolu, soyut temel sınıf kullanan bir hiyerarşi olarak düşünülebilir.
- Ancak hiyerarşinin kısıtları ve ilgisiz tiplerin union olarak ifade edilememesi gibi sorunlar vardır.
- Birden çok union türüne ihtiyaç duyulabilir ve bu öneri bunları dört kategoriye ayırır.
Standart - union class
Bildirim
- Union class, enum'a benzer şekilde bildirilir.
- Her üye durum değişkenlerine sahip olabilir.
Oluşturma
- Üye tiplerin instance'ları atanarak oluşturulur.
Ayrıştırma
- Type test ve pattern matching ile ayrıştırılır.
Kapsayıcılık
- Tüm üye tipler
switchifadesi veya deyiminde ele alındığında varsayılan bir case gerekmez.
Null olasılığı
- Null dahil etmek için standart nullability gösterimi kullanılır.
Uygulama
- Union class, soyut bir record class olarak uygulanır.
Özelleşmiş - union struct
Bildirim
- Union class'a benzer şekilde bildirilir, ancak
structanahtar sözcüğü eklenir.
Oluşturma
- Üye tiplerin instance'ları atanarak oluşturulur.
Ayrıştırma
- Type test ve pattern matching ile ayrıştırılır.
Kapsayıcılık
- Tüm üye tipler
switchifadesi veya deyiminde ele alındığında varsayılan bir case gerekmez.
Null olasılığı
- Null dahil etmek için standart nullability gösterimi kullanılır.
Varsayılan değer
- Union struct, atanmadığında veya varsayılan değer olarak atandığında tanımsız bir durumda olabilir.
Uygulama
- Union struct bir struct olarak uygulanır ve üye tipler iç içe record struct'lar olarak uygulanır.
Geçici - ad hoc union
Sözdizimi
- Ad hoc union,
orpattern sözdizimi kullanılarak referans verilir.
Adlandırma
- Dosya veya global using alias kullanılarak ad hoc union'a ortak bir ad verilebilir.
Oluşturma
- Üye tiplerin instance'ları atanarak oluşturulur.
Ayrıştırma
- Type test ve pattern matching ile ayrıştırılır.
Kapsayıcılık
- Tüm üye tipler
switchifadesi veya deyiminde ele alındığında varsayılan bir case gerekmez.
Null olasılığı
- Null dahil etmek için standart nullability gösterimi kullanılır.
Karşılıklı değiştirilebilirlik
- Aynı üye tiplerine sahip ad hoc union'lar birbirinin yerine kullanılabilir.
Kullanıcı tanımlı union
- Union class veya union struct olarak ifade edilemeyen union tipleri bildirilebilir.
- Hiyerarşi
Closedözniteliği kullanılarak kapatılabilir. Unionözniteliği kullanılarak struct wrapper olarak uygulanabilir.
Yaygın union'lar
Option
- Bir değerin var olabileceği ya da olmayabileceği durumu temsil eden bir struct union'dır.
Result
- Fonksiyonlardan başarılı sonuç veya hata döndüren bir struct union'dır.
İlgili öneriler
Kapalı hiyerarşi
Closedözniteliği kullanılarak soyut temel tip üzerinde kapalı bir alt tip kümesi bildirilir.
Singleton değerler
- Singleton özniteliğine sahip tipler, tip dışı bağlamlarda değer olarak kullanılabilir.
İç içe üye kısaltması
- Bağlanmamış adlar kullanılarak hedef tipin statik üyelerine veya iç içe tiplerine bağlanılabilir.
GN⁺ Özeti
- Bu belge, C# için type union'ları önerir ve çeşitli durumlarda bir değişkende birden fazla tip saklamanın yolunu sunar.
- Diğer dillerin zaten sunduğu bu özelliği C#'a getirmeyi amaçlayan bir girişimdir.
- Geliştiricilerin kod okunabilirliğini ve bakım kolaylığını artırmasına yardımcı olabilir.
- Benzer bir özelliği sunan diğer dillere F# örnek verilebilir.
1 yorum
Hacker News görüşleri
F#'ta ayrımlı union'lar kullanıyordum ve C#'ta da vardır diye düşünmüştüm
"type union" terimi kulağa yabancı geliyor
Uzun yıllardır C# geliştiricisi olarak bu önerinin kullanım alanı bana net gelmiyor
TypeScript'te type union'lar var
Pattern matching yapılabilen union'lar olmadan programlama zorlaşıyor
C# union'larında field offset kullanma deneyimim var
u64ile nesnenin struct union'ı ayrı alanlar gerektirdiği için 8 byte israf edebilirÖzel constructor'lar ve bir nuget paketi kullanarak switch type'ın
_case'ine ihtiyaç duymamasını sağlıyorumUnion struct'ların eşzamanlı değişikliklerde tearing'i nasıl ele aldığı belirtilmiyor