मैं इसके कार्यान्वयन में देख रहा था:

 Enumerable.Empty<...>()

और मैंने देखा कि हुड के तहत यह इसे नियोजित करता है:

    public static IEnumerable<TResult> Empty<TResult>() => (IEnumerable<TResult>) EmptyEnumerable<TResult>.Instance;

जो बदले में इसे नियोजित करता है:

    internal class EmptyEnumerable<TElement>
    {
        public static readonly TElement[] Instance = new TElement[0];
    }

मैं मुश्किल से समझ सकता हूं कि यह कैसे काम करता है। क्या कोई इसे मेरे लिए तोड़ सकता है? कंपाइलर और रनटाइम इसे कैसे संभालता है?

मेरे कहने का मतलब यह है कि प्रत्येक कॉल के लिए .Empty<>():

   Enumerable.Empty<string>()
   Enumerable.Empty<int>()
   Enumerable.Empty<SomeCustomClass>()

रनटाइम को पुन: प्रयोज्य सिंगलटन/लगातार वर्ग के उदाहरणों का निर्माण करना चाहिए:

   EmptyEnumerable<string>
   EmptyEnumerable<int>
   EmptyEnumerable<SomeCustomClass>

और ये उदाहरण (सिंगलटन होने के कारण) कभी भी निपटाए नहीं जाते हैं - यदि हम पहले से उपयोग किए गए प्रकारों में से किसी एक के साथ कॉल करने का प्रयास करते हैं तो उनका पुन: उपयोग किया जाता है। खाली <>()।

सही? या क्या मैं कुछ न कुछ भूल रहा हूं?

-1
XDS 17 फरवरी 2021, 13:10
मुझे लगता है कि आप इसे अधिकांश भाग के लिए सही ढंग से समझ रहे हैं, लेकिन मुझे लगता है कि आप कक्षाओं को शुरू करने की लागत को कम कर रहे हैं। याद रखें कि एक नया बंद वर्ग प्रकार केवल प्रत्येक भिन्न प्रकार के IEnumerable के लिए प्रारंभ किया गया है। उदाहरण के लिए, Enumerable.Empty<string>() को दो बार कॉल करना EmptyEnumerable<string> को दो बार इनिशियलाइज़ नहीं करता है। आप अपने आवेदन में कितने भिन्न प्रकार के पैरामीटर Empty देने जा रहे हैं? मुझे लगता है कि सैकड़ों/हजारों नहीं।
 – 
Sweeper
17 फरवरी 2021, 13:37

1 उत्तर

सबसे बढ़िया उत्तर

अधिकतर इस पैटर्न का उपयोग वस्तुओं को कैशिंग करने के लिए किया जाता है।

हर बार जब आप Empty संपत्ति को कॉल करके एक खाली सरणी का अनुरोध करते हैं, तो यह हमेशा एक ही वस्तु देता है। यह प्रत्येक Empty कॉल को समान T पैरामीटर के साथ नई ऑब्जेक्ट नहीं बनाता है।

संपादित करें: उस स्थिति में, यह आपके SomeCustomClass के किसी भी उदाहरण को क्रेट नहीं कर रहा है, बस कुछ CustomClass की सरणी बनाता है। इससे कोई फर्क नहीं पड़ता कि जेनेरिक पैरामीटर टाइप करने के लिए भारी है या नहीं।

2
enisn 17 फरवरी 2021, 13:54