C# में Type Unions का आधिकारिक प्रस्ताव
(github.com/dotnet)सारांश
यह दस्तावेज़ C# में type unions (या discriminated unions) का प्रस्ताव देता है.
प्रेरणा
- सॉफ़्टवेयर डेवलपमेंट में किसी variable में स्टोर होने वाले मान हमेशा एक ही प्रकार के नहीं हो सकते.
- उदाहरण के लिए, जब customer और supplier की परिभाषाएँ केवल कुछ properties साझा करती हैं, तो दोनों types पर समान operations करने की ज़रूरत पड़ सकती है.
- इसे inheritance के ज़रिए हल किया जा सकता है, लेकिन यह हर स्थिति के लिए उपयुक्त नहीं है.
- C# में सीमित संख्या के अलग-अलग types को एक ही variable में स्टोर करने का तरीका चाहिए.
- दूसरी भाषाएँ पहले से यह सुविधा देती हैं.
समाधान
- C# में union types को implement करने का सबसे उपयुक्त तरीका abstract base class का उपयोग करने वाली hierarchy के रूप में देखा जा सकता है.
- लेकिन hierarchy की सीमाएँ, और असंबंधित types के union को व्यक्त न कर पाने जैसी समस्याएँ हैं.
- कई तरह के unions की ज़रूरत हो सकती है, और यह प्रस्ताव उन्हें चार categories में वर्गीकृत करता है.
मानक - Union Class
घोषणा
- Union class को
enumकी तरह declare किया जाता है. - हर member में state variables हो सकते हैं.
निर्माण
- Member type के instance को assign करके इसे बनाया जाता है.
विघटन
- Type test और pattern matching के ज़रिए इसका विघटन किया जाता है.
पूर्णता
- यदि सभी member types को
switchexpression या statement में cover कर लिया गया हो, तो default case की ज़रूरत नहीं होती.
Nullability
- Null को शामिल करने के लिए standard nullability notation का उपयोग किया जा सकता है.
कार्यान्वयन
- Union class को abstract record class के रूप में implement किया जाता है.
विशेषीकृत - Union Struct
घोषणा
- इसे union class की तरह declare किया जाता है, लेकिन
structkeyword जोड़ा जाता है.
निर्माण
- Member type के instance को assign करके इसे बनाया जाता है.
विघटन
- Type test और pattern matching के ज़रिए इसका विघटन किया जाता है.
पूर्णता
- यदि सभी member types को
switchexpression या statement में cover कर लिया गया हो, तो default case की ज़रूरत नहीं होती.
Nullability
- Null को शामिल करने के लिए standard nullability notation का उपयोग किया जा सकता है.
डिफ़ॉल्ट मान
- Union struct बिना assign किए रहने पर, या default value assign होने पर, undefined state में हो सकता है.
कार्यान्वयन
- Union struct को struct के रूप में implement किया जाता है, और member types को nested record structs के रूप में implement किया जाता है.
अस्थायी - Ad Hoc Union
सिंटैक्स
- Ad hoc union को
orpattern syntax का उपयोग करके refer किया जाता है.
नामकरण
- File या global
usingalias के ज़रिए ad hoc union को एक common name दिया जा सकता है.
निर्माण
- Member type के instance को assign करके इसे बनाया जाता है.
विघटन
- Type test और pattern matching के ज़रिए इसका विघटन किया जाता है.
पूर्णता
- यदि सभी member types को
switchexpression या statement में cover कर लिया गया हो, तो default case की ज़रूरत नहीं होती.
Nullability
- Null को शामिल करने के लिए standard nullability notation का उपयोग किया जा सकता है.
परस्पर विनिमेयता
- एक जैसे member types वाले ad hoc unions आपस में interchangeable होते हैं.
User-defined Union
- ऐसे union types declare किए जा सकते हैं जिन्हें union class या union struct के रूप में निर्दिष्ट नहीं किया जा सकता.
Closedattribute का उपयोग करके hierarchy को बंद किया जा सकता है.Unionattribute का उपयोग करके इसे struct wrapper के रूप में implement किया जा सकता है.
सामान्य Union
Option
- यह एक struct union है जो ऐसे मान को दर्शाता है जो मौजूद भी हो सकता है और नहीं भी.
Result
- यह एक struct union है जो function से successful result या error लौटाता है.
संबंधित प्रस्ताव
बंद Hierarchy
Closedattribute का उपयोग करके abstract base type के लिए subtypes के एक बंद सेट की घोषणा की जाती है.
Singleton Value
- Singleton property वाले types को non-type context में value के रूप में इस्तेमाल किया जा सकता है.
Nested Member Shorthand
- Unbound names का उपयोग करके target type के static members या nested types से bind किया जा सकता है.
GN⁺ का सार
- यह दस्तावेज़ C# में type unions का प्रस्ताव देता है और विभिन्न परिस्थितियों में किसी variable में कई types स्टोर करने का तरीका प्रदान करता है.
- यह C# में वह सुविधा लाने का प्रयास है जो दूसरी भाषाओं में पहले से मौजूद है.
- इससे developers को code की readability और maintainability बढ़ाने में मदद मिल सकती है.
- इसी तरह की सुविधा देने वाली दूसरी भाषाओं में F# एक उदाहरण है.
1 टिप्पणियां
Hacker News राय
F# में discriminated unions का उपयोग किया है, और सोचा था कि C# में भी यह होगा
"type union" शब्द अपरिचित लगता है
लंबे समय से C# डेवलपर होने के नाते, इस प्रस्ताव के use case स्पष्ट नहीं लगते
TypeScript में type unions हैं
pattern matching करने योग्य unions के बिना प्रोग्रामिंग कठिन हो जाती है
C# unions में field offsets का उपयोग करने का अनुभव है
private constructors और nuget package का उपयोग करके switch type को
_case की आवश्यकता न पड़े, ऐसा किया गया हैयह नहीं बताया गया कि union structs concurrent mutation के समय tearing को कैसे संभालेंगे