1 पॉइंट द्वारा GN⁺ 2024-08-09 | 1 टिप्पणियां | WhatsApp पर शेयर करें

सारांश

यह दस्तावेज़ 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 को switch expression या statement में cover कर लिया गया हो, तो default case की ज़रूरत नहीं होती.

Nullability

  • Null को शामिल करने के लिए standard nullability notation का उपयोग किया जा सकता है.

कार्यान्वयन

  • Union class को abstract record class के रूप में implement किया जाता है.

विशेषीकृत - Union Struct

घोषणा

  • इसे union class की तरह declare किया जाता है, लेकिन struct keyword जोड़ा जाता है.

निर्माण

  • Member type के instance को assign करके इसे बनाया जाता है.

विघटन

  • Type test और pattern matching के ज़रिए इसका विघटन किया जाता है.

पूर्णता

  • यदि सभी member types को switch expression या 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 को or pattern syntax का उपयोग करके refer किया जाता है.

नामकरण

  • File या global using alias के ज़रिए ad hoc union को एक common name दिया जा सकता है.

निर्माण

  • Member type के instance को assign करके इसे बनाया जाता है.

विघटन

  • Type test और pattern matching के ज़रिए इसका विघटन किया जाता है.

पूर्णता

  • यदि सभी member types को switch expression या 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 के रूप में निर्दिष्ट नहीं किया जा सकता.
  • Closed attribute का उपयोग करके hierarchy को बंद किया जा सकता है.
  • Union attribute का उपयोग करके इसे struct wrapper के रूप में implement किया जा सकता है.

सामान्य Union

Option

  • यह एक struct union है जो ऐसे मान को दर्शाता है जो मौजूद भी हो सकता है और नहीं भी.

Result

  • यह एक struct union है जो function से successful result या error लौटाता है.

संबंधित प्रस्ताव

बंद Hierarchy

  • Closed attribute का उपयोग करके 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 टिप्पणियां

 
GN⁺ 2024-08-09
Hacker News राय
  • F# में discriminated unions का उपयोग किया है, और सोचा था कि C# में भी यह होगा

    • Java का उपयोग कर रहे हैं, और लगता है कि ADT के बिना भाषा में वापस जाना मुश्किल है
    • C# की बड़ी फीचर कमी के लिए माफ़ी न मांगनी पड़े, इससे खुशी है
  • "type union" शब्द अपरिचित लगता है

    • यह ML परिवार की भाषाओं के tagged unions जैसा दिखता है
    • सोच रहे हैं कि क्या C# डेवलपर्स की प्रवृत्ति मौजूदा शब्दों से अलग नाम बनाने की है
  • लंबे समय से C# डेवलपर होने के नाते, इस प्रस्ताव के use case स्पष्ट नहीं लगते

    • लगता है कि खाली interface और record classes घोषित करके इसे लागू किया जा सकता है
    • सोच रहे हैं कि कहीं कुछ छूट तो नहीं रहा
  • TypeScript में type unions हैं

    • यह F# या Haskell के discriminated unions जैसा दिखता है
    • discriminated unions में named case constructors होते हैं
  • pattern matching करने योग्य unions के बिना प्रोग्रामिंग कठिन हो जाती है

    • expression problem का अर्थ पूरी तरह समझ नहीं पाया
    • मौजूदा polymorphism के जरिए extension points देना भविष्य के clients के लिए उपयुक्त हो सकता है
    • टीम के स्वामित्व वाले कोड के लिए pattern matching करने योग्य unions अधिक उपयुक्त हैं
  • C# unions में field offsets का उपयोग करने का अनुभव है

    • pointer/reference values और values की aliasing undefined behavior पैदा कर सकती है
    • u64 और object के struct union में अलग field चाहिए हो सकता है, जिससे 8 bytes व्यर्थ जा सकते हैं
  • private constructors और nuget package का उपयोग करके switch type को _ case की आवश्यकता न पड़े, ऐसा किया गया है

    • यह प्रस्तावित "union class" के desugared version जैसा है
    • अच्छा है कि nuget package अनावश्यक हो जाए और syntactic sugar जुड़ जाए
  • यह नहीं बताया गया कि union structs concurrent mutation के समय tearing को कैसे संभालेंगे

    • tearing memory safety समस्याएँ पैदा कर सकती है
    • ऐसे variants हो सकते हैं जिनमें एक ही offset पर integer field और reference field हों