2011-02-04 10 views
16

क्या किसी को पता है कि माइक्रोसॉफ्ट ने .NET Framework 4.0 में आलसी < टी> कक्षा की तरह एक साफ़() विधि या IsDirty संपत्ति या कुछ शामिल क्यों नहीं किया? (नीचे अपडेट किया गया प्रश्न)आलसी <T> पुनर्नवीनीकरण विधि?

हमारे पास एक होमब्रू प्रकार है जिसे हम .NET 3.5 के बाद से उपयोग कर रहे हैं, जहां मैं काम करता हूं जो Lazy < टी> क्लास जैसा ही काम करता है, उदाहरण के लिए आपको आलसी Func का फिर से मूल्यांकन करने की अनुमति मिलती है । हम अपनी कक्षा को नए .NET के साथ प्रतिस्थापित करना चाहते हैं लेकिन यह साफ़() या IsDirty तंत्र मौजूद नहीं है।

मुझे टिप्पणियों के आधार पर मूल प्रश्न दोबारा दोहराएं। क्या कक्षा को बहाल किए बिना आलसी < टी> Func विधि को फिर से शुरू करने का कोई तरीका है? यदि नहीं, तो क्या इसे एक विस्तार विधि के रूप में लागू करने का कोई तरीका है या केवल पहले स्थान पर पालन करने के लिए बस एक खराब पैटर्न है?

+7

"क्यों नहीं" प्रश्न केवल rants हैं। क्या आप इसे एक और रचनात्मक तरीके से फिर से बदल सकते हैं? –

+0

एक विस्तार विधि जोड़ें ... –

+0

मुझे लगता है क्योंकि इसे एक मान के रूप में देखा जाना चाहिए और दूसरा मान एक ही मूल्य नहीं है। – Skurmedel

उत्तर

10

क्योंकि इसे थ्रेड-सुरक्षित बनाना असंभव है। कक्षाएं गारंटी कि प्रोग्रामर समस्या को ठीक करने के किसी भी तरीके से अपने पैर को बंद कर देगा, ढांचे में नहीं है। आप अपने पैर को शूट करने के लिए स्वतंत्र हैं।

+2

थ्रेड-सुरक्षा आलसी वर्ग के लिए एक विकल्प है - और शायद डिफ़ॉल्ट भी नहीं। इसलिए, यह उत्तर ज्यादा लागू नहीं होता है। – flq

+1

इसे थ्रेड सुरक्षित बनाने के लिए * असंभव * क्यों है? क्या यह लॉक ब्लॉक के अंदर सिर्फ एक अपडेट नहीं है और दो गुणों ('IsValueCreated' और 'Value') पर कुछ अतिरिक्त ताले हैं? मैं बहु थ्रेडिंग पर एक विशेषज्ञ नहीं हूं, लेकिन यह पहली नजर में व्यवहार्य लगता है ... – user2173353

1

क्या IsValueCreated आपके लिए काम नहीं करता है?

+1

IsValueCreated पढ़ा जाता है ... अगर संपत्ति में एक सेटर होता और अगले उपयोग पर पुनर्मूल्यांकन होता है। –

6

आप क्या करना चाहते हैं आलसी प्रारंभिक नहीं है, यह कुछ और है। यही कारण है कि यह Lazy<T> कक्षा पर नहीं है।

4

क्योंकि यह इस प्रकार के अर्थशास्त्र को तोड़ देगा। यदि Lazy<T> की स्थिति समय के साथ अमान्य हो जाती है तो आपको एक अलग प्रकार पर विचार करने की आवश्यकता है।

2

यदि आपको वास्तव में अपने आलसी <> ऑब्जेक्ट को रीसेट करने की आवश्यकता है तो आपको आलसी <> प्रकार का नया उदाहरण बनाने के लिए तंत्र की आवश्यकता है। आप एक रैपर बना सकते हैं जो आलसी <> प्रकार प्लस रीसेट-विधि के समान गुणों को उजागर करता है जो इसे आसानी से पुनर्निर्मित करता है। असली सवाल आप ऐसा कुछ करना चाहिए है, लेकिन यह आपकी आवश्यकताओं के लिए पर्याप्त हो सकता है यदि आप वास्तव में करने की जरूरत है

public class ResettableLazy<T> 
{ 
    public T Value => this.Container.Value; 
    public bool IsValueCreated => this.Container.IsValueCreated; 
    public void Reset() { this.Container = new Lazy<T>(); } 
    private Lazy<T> Container = new Lazy<T>(); 
} 

: सरल शब्दों में यह की तरह कुछ होगा।

संबंधित मुद्दे