2011-12-22 15 views
9

जब आप किसी वर्ग का उदाहरण बनाते हैं, तो उस उदाहरण के सभी चर उस उदाहरण के लिए विशिष्ट होते हैं और जब आवंटन का दायरा समाप्त होता है तो उसे मार दिया जाता है। लेकिन यह एक स्थिर विधि में कैसे काम करता है? मान लीजिए कि दो लोग सिस्टम एक ही समय में System.Math.Abs ​​() को कॉल करते हैं। रनटाइम दो कॉलर्स के बीच अंतर कैसे करता है? क्या यह थ्रेडिंग आता है? अलग-अलग थ्रेड स्वचालित रूप से प्रत्येक कॉलर के लिए बनाए जाते हैं?क्या होता है जब आप सी # में एक स्थिर विधि कहते हैं?

+1

क्या [यह] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) आपके प्रश्न का उत्तर देता है? –

+4

.ToString एक स्थिर विधि नहीं है। –

+0

इमानुअल, मैंने आपके द्वारा उल्लिखित पोस्ट की जांच की। यह मेरी चिंता का समाधान करता है, लेकिन इसका उत्तर नहीं देता :( – developer747

उत्तर

10

विधि-परिवर्तनीय जीवनकाल के मामले में स्थिर और गैर स्थैतिक तरीकों के बीच कोई वास्तविक अंतर नहीं है। दोनों मामलों में, एक कार्यान्वयन विवरण के रूप में, स्थानीय लोग आम तौर पर स्टैक पर आवंटित (हमेशा अपवाद नहीं होते हैं) अपवादित होते हैं। ढेर प्रति थ्रेड है, इसलिए स्थानीय विधि चर धागे के बीच क्रॉसओवर नहीं है।

फर्क सिर्फ इतना है यहाँ उदाहरण और स्थिर के बीच कि उदाहरण के तरीकों, उर्फ ​​"यह", कॉल करने वाले को धकेल दिया जाता है (प्लस कुछ आभासी प्रेषण और अशक्त-जाँच मज़ा) एक अंतर्निहित zeroth पैरामीटर है।

सादगी के लिए, मैं iterator ब्लॉक, पर कब्जा कर लिया चर, आदि पर glossing रहा हूँ

+0

धन्यवाद मार्क! – developer747

6

कक्षा के सभी स्थिर सदस्य मौजूद हैं, भले ही कक्षा का कोई उदाहरण मौजूद न हो। वे पहले उपयोग से पहले कुछ समय पहले शुरू हो जाते हैं और प्रोग्राम पूरा होने पर साफ़ हो जाते हैं।

यदि आपके पास एक स्थिर विधि के लिए दो एक साथ कॉल हैं, तो वे कक्षा के किसी भी स्थिर सदस्यों (यदि वे उनका उपयोग करते हैं) की एक ही प्रति के साथ काम करेंगे। इसलिए यदि स्थिर विधि स्थिर सदस्य (या पैरामीटर) पर चलती है, तो इसे थ्रेड सुरक्षित तरीके से करना चाहिए। यदि स्थैतिक विधि केवल स्थानीय लोगों पर ही चलती है तो विधि स्वयं आमतौर पर थ्रेड सुरक्षित होती है।

रनटाइम दो कॉलर्स के बीच अंतर कैसे करता है, यह थ्रेडिंग का सार है। प्रत्येक धागे का अपना कॉल स्टैक किसी भी स्थानीय चर, पैरामीटर, रिटर्न एड्रेस इत्यादि की अपनी प्रतिलिपि के साथ होता है, इसलिए दो कॉल उलझन में नहीं आती हैं और प्रत्येक अपने कॉलर पर सही तरीके से लौटती है। एकमात्र चिंता, फिर से, यह है कि स्थिर विधि स्थिर सदस्य पर चलती है जो थ्रेड सुरक्षित नहीं है (या पैरामीटर जो थ्रेड सुरक्षित नहीं है)।

+0

अच्छी व्याख्या जेम्स। धन्यवाद। लोग कैसे जानते हैं कि आपने मुझे अभी क्या बताया है? क्या आप कुछ अच्छी किताब की सिफारिश कर सकते हैं, जो इस तरह के मूलभूत सिद्धांतों को संबोधित करते हैं? – developer747

+0

इनमें से अधिकांश मैंने केवल सीखा प्रोग्रामिंग भाषा सिद्धांत और प्रोग्रामिंग भाषाओं के आत्म-अध्ययन से कॉम्पसी coursework में मेरा बीएस। यदि आप वास्तव में विवरण में शामिल होना चाहते हैं, तो सी # भाषा विशिष्टता पढ़ें, यह आपको कार्यान्वयन के बारे में जानने के लिए सबकुछ बताएगा: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –

+0

यदि आपको अपने अंडरग्रेड (जो इस तरह के मौलिक सिद्धांतों को संबोधित करते हैं) से एक पुस्तक की सिफारिश करनी है तो यह क्या होगा? – developer747

12

जब आप एक वर्ग का एक उदाहरण बनाने के लिए, यह सब उदाहरण के लिए विशिष्ट चर मारे गए हैं जब उदाहरण से बाहर है गुंजाइश।

चर - आम तौर पर कहा जाता है "फील्ड" उदाहरण केजीवन के बाद पुनः आवंटित की जाती रहे हैं। स्कोप प्रोग्राम टेक्स्ट का क्षेत्र है जिसमें संकलक इसके नाम से कुछ पहचानता है; लिफ्टटाइमसमय का हिस्सा है जिसके दौरान एक संग्रहण स्थान मान्य है। दायरा और जीवनकाल अक्सर भ्रमित होते हैं।

लेकिन यह एक स्थिर विधि में कैसे काम करता है?

स्टेटिक फ़ील्ड में असंबद्ध जीवनकाल है; भंडारण स्थान कुछ समय पहले बनाया गया है जब तक कि क्षेत्र का उपयोग नहीं किया जाता है और तब तक नष्ट नहीं होता जब तक कि पेट काटा नहीं जाता है।

मान लीजिए कि दो लोग सिस्टम एक ही समय में System.Math.Abs ​​() को कॉल करते हैं।

ठीक है। आप कैसे प्रस्तावित करते हैं कि ऐसा होता है?

रनटाइम दो कॉलर्स के बीच अंतर कैसे करता है? क्या यह थ्रेडिंग आता है?

स्थैतिक विधि मशीन निर्देशों के समूह में लगाई गई है जो स्मृति में संख्याएं हैं। निष्पादन के प्रत्येक धागे में निर्देश सूचक नामक एक संख्या है जो वर्तमान निर्देश का पता लगाती है। दो अलग-अलग धागे दोनों में निर्देश पॉइंटर्स हो सकते हैं जो एक ही समय में एक ही स्थिर विधि के अंदर हैं।

प्रत्येक कॉलर के लिए स्वचालित रूप से अलग थ्रेड बनाए जाते हैं?

प्रश्न कोई समझ नहीं आता है। पर दो कॉलर कैसे प्राप्त हुए थे यदि वे पहले से ही अलग थ्रेड पर नहीं थे?

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