2011-06-16 6 views
5
public class MyClass<T> 
{ 
    public static readonly String MyStringValue; 

    static MyClass() 
    { 
     MyStringValue = GenerateString(); 
    } 

    private static String GenerateString() 
    { 
     //Dynamically generated ONCE per type (hence, not const) 
    } 

    public void Foo() 
    { 
     Console.WriteLine(MyStringValue); 
    } 
} 

यह मेरी समझ है कि स्थिर पाठक स्ट्रिंग कक्षा तक स्थिर कन्स्ट्रक्टर कहलाए जाने तक उत्पन्न नहीं होगा। लेकिन, स्थैतिक कन्स्ट्रक्टर तब तक नहीं बुलाया जाएगा जब तक कि स्थैतिक तरीकों में से एक या चर का उपयोग नहीं किया जाता है।सी # - स्टेटिक रीडोनली स्ट्रिंग्स - मल्टीथ्रेड मुद्दों में चलाने के लिए संभव है?

बहु-थ्रेडेड वातावरण में इस वजह से मुद्दों में भागना संभव है? असल में, डिफ़ॉल्ट सिंगलटन द्वारा स्थिर कन्स्ट्रक्टर लॉक किया गया है या क्या मुझे इसे स्वयं करना है? यही कारण है ... मैं निम्नलिखित मुझे क्या करना होगा:

private static Object MyLock; 

static MyClass() 
{ 
    lock(MyLock) 
    { 
     if (MyStringValue == null) 
      MyStringValue = GenerateString(); 
    } 
} 
+0

संभावित डुप्लिकेट [क्या सी # स्थिर कन्स्ट्रक्टर थ्रेड सुरक्षित है?] (Http://stackoverflow.com/questions/7095/is-the-c-static-constructor-thread-safe) –

उत्तर

8

स्थिर निर्माता केवल एक बार instantiated प्रकार के अनुसार चलाने के लिए गारंटी है। तो आपको अपनी लॉकिंग की आवश्यकता नहीं है।

ध्यान दें कि यह प्रत्येक सामान्य पैरामीटर के लिए एक बार चलाएगा। और सामान्य वर्ग पर स्थिर फ़ील्ड या तो विभिन्न सामान्य मानकों के बीच साझा नहीं किए जाते हैं।

1

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

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