एक संपत्ति को दो बार रिकॉर्ड में परिभाषित करना

Dec 02 2020

C # 9 में, कोई व्यक्ति अपने प्राथमिक कंस्ट्रक्टर और उसके शरीर में रिकॉर्ड में एक ही नाम के साथ एक संपत्ति को परिभाषित कर सकता है:

record Cat(int PawCount)
{
    public int PawCount { get; init; }
}

यह कोड त्रुटियों के बिना संकलित है।

इस तरह के रिकॉर्ड का उदाहरण देते समय, निर्माता को प्रदान किया गया मान पूरी तरह से नजरअंदाज कर दिया जाता है:

Console.WriteLine(new Cat(4));
Console.WriteLine(new Cat(4) { PawCount = 1 });

प्रिंट

Cat { PawCount = 0 }
Cat { PawCount = 1 }

क्या यह व्यवहार सही है या यह एक बग है? यदि यह सही है, तो ऐसे कौन से मामले हैं जिनमें यह उपयोगी है?

मुझे उम्मीद थी कि संकलक या तो इस कोड को एक त्रुटि के साथ अस्वीकार कर देगा जैसे 'प्रकार में Catपहले से ही एक परिभाषा है PawCount' या निर्माणकर्ता में संपत्ति पर विचार करना और उसी में, निर्माणकर्ता से इसकी शुरुआत का प्रदर्शन करना। बाद वाला संस्करण कस्टम बॉडी और / या इनीशलाइज़र के साथ संपत्ति प्रदान करने के लिए उपयोगी हो सकता है, इसके शरीर में स्थितीय रिकॉर्ड के सभी गुणों को फिर से लिखने के बिना।

वास्तविक व्यवहार से मुझे कोई मतलब नहीं है।

जवाब

9 YairHalberstadt Dec 02 2020 at 22:10

ऐसा करने का सही तरीका है:

record Cat(int PawCount)
{
    public int PawCount { get; init; } = PawCount;
}

यह उपयोगी है क्योंकि यह आपको उदा सत्यापन करने की अनुमति देता है

record Cat(int PawCount)
{
    private int _pawCount;
    public int PawCount {
        get => _pawCount;
        init => _pawCount = value < 0 ? throw new ArgumentException() : value; 
    } = PawCount;
}

इसके लिए युक्ति यहाँ है: https://github.com/dotnet/csharplang/blob/master/proposals/csharp-9.0/records.md#members-of-a-record-type

सदस्यों को तब तक संश्लेषित किया जाता है जब तक कि रिकॉर्ड मिलान निकाय में "मिलान" हस्ताक्षर वाला सदस्य या "मिलान" हस्ताक्षर के साथ एक सुलभ ठोस गैर-आभासी सदस्य घोषित नहीं किया जाता है। दो सदस्यों को मिलान माना जाता है यदि उनके पास एक ही हस्ताक्षर है या विरासत के परिदृश्य में "छिपाना" माना जाएगा।

इसलिए जब से एक ही नाम के साथ एक संपत्ति के रूप में पैरामीटर पहले से मौजूद है, संकलक एक PawCountसंपत्ति को संश्लेषित नहीं करता है, और इसलिए बस चुपचाप पैरामीटर की उपेक्षा करता है जब तक कि आप इसे स्पष्ट रूप से उपयोग नहीं करते हैं।