2010-04-26 10 views
13

मेरे पास आज एक साक्षात्कार था और हर चीज बहुत अच्छी हो रही थी, लेकिन फिर एक साक्षात्कारकर्ता ने मुझे एक प्रश्न पूछा सी # में स्टेटिक वैरिएबल वर्क कहां है - आवेदन स्तर पर या पृष्ठ स्तर पर।ASP.NET पृष्ठ में स्थैतिक चर काम कहां करता है?

मैं इस उत्तर के बारे में बहुत स्पष्ट नहीं था क्योंकि मुझे केवल इतना पता था कि स्थैतिक चर ढेर पर संग्रहीत हैं और मुझे वेब से संबंधित चीज़ के बारे में कुछ नहीं पता था।

फिर उसने मुझे एक उदाहरण देकर और अधिक स्पष्ट करने की कोशिश की कि एक पृष्ठ में मैं स्थैतिक चर का उपयोग कर रहा हूं और तीन उपयोगकर्ता पृष्ठ का उपयोग कर रहे हैं, उपयोगकर्ता में से एक स्थिर चर के मूल्य को अद्यतन करता है, शेष मूल्य शेष के लिए क्या दिखाई देगा दो उपयोगकर्ता पुरानी प्रतिलिपि या अद्यतन परिलक्षित होंगे।

+7

यादृच्छिक विचार, उन्हें प्राप्त करें कि आपने जो ज्ञान प्राप्त किया है, उसके साथ अब आप इस प्रश्न का उत्तर कैसे देंगे। डेवलपर की सबसे महत्वपूर्ण क्षमताओं में से एक यह जानना है कि ज्ञान की कमी कब स्वीकार करें और फिर नए ज्ञान के साथ इसे दूर करने में सक्षम हो जाएं। –

उत्तर

20

जब तक यह [ThreadStatic] नहीं है, तब तक एक स्थिर चर के प्रत्येक ऐपडोमेन के लिए केवल एक मान होगा।

एएसपी.Net में, प्रत्येक एप्लिकेशन का अपना ऐपडोमेन होता है, इसलिए आवेदन में सभी अनुरोधों से स्थैतिक चर साझा किए जाएंगे। एएसपी.Net अनुप्रयोगों में static चर का उपयोग करके साक्षात्कारकर्ता यह प्राप्त कर रहा था - एक आम गलती है जो कई अनुरोधों को एक बार में होने पर रहस्यमय भ्रष्टाचार त्रुटियों का कारण बन सकती है।

+0

ऐपडोमेन क्या है और इसका उद्देश्य क्या है –

+0

http://msdn.microsoft.com/en-us/library/dah4cwez%28v=VS.100%29.aspx – SLaks

+0

@ स्लैक्स: तो आप कहना चाहते हैं कि थ्रेडस्टैटिक असली था साक्षात्कारकर्ता की चिंता। वह स्थिर चर के बारे में एक ही बात जानना चाहता था। इस मामले में आपका जवाब क्या होगा। थ्रेडस्टैटिक का उपयोग करते समय सभी उपयोगकर्ताओं को अद्यतन मूल्य मिल जाएगा? –

4

एक पृष्ठ के मूल्य को बदलने के बाद, अन्य पृष्ठ सभी अपडेट किए गए मान प्राप्त करेंगे।

यह हो सकता है कि आप क्या चाहते हैं या नहीं भी हो सकता है। यही कारण है कि वेब प्रोग्रामिंग में स्थैतिक चर खतरनाक हैं। उदाहरण के लिए विनफॉर्म एप्लिकेशन में, एक स्थिर चर इस प्रक्रिया के लिए वैश्विक मानों को संग्रहीत करने के लिए ठीक काम करता है, क्योंकि केवल एक प्रक्रिया चल रही है। आपको अपेक्षित व्यवहार मिलता है।

हालांकि एक वेब एप्लिकेशन में, आपका कोड में में कई धागे में शुरू किया जा सकता है। जब मूल्य साझा किया जाता है तो डेवलपर्स कभी-कभी आश्चर्यचकित होते हैं।

यदि आप मान अलग करना चाहते हैं (आप आमतौर पर करते हैं), तो आप इसे ThreadStatic विशेषता का उपयोग करके मजबूर कर सकते हैं। विभिन्न वेब अनुरोध अलग-अलग धागे में हैं, इसलिए वे एक-दूसरे से अनजान रहेंगे। मैं इसका कभी भी उपयोग नहीं करता क्योंकि मुझे अगले पृष्ठ कॉल से पहले मूल्य से छुटकारा पाने के लिए कचरा संग्रह पर भरोसा नहीं है, जो एक ही थ्रेड का पुन: उपयोग कर सकता है। इसी प्रकार, मैं एएसपीनेट धागे के बीच मूल्यों को उद्देश्य से साझा करने के लिए स्थिर चर पर भरोसा नहीं करता; server variable का उपयोग करें।

+0

@ पैट्रिक, तो इसका मतलब है कि स्थैतिक चर साझा की गई मेमोरी का उपयोग कर रहे थे क्योंकि मैं उम्मीद कर रहा था लेकिन एकाधिक उपयोगकर्ताओं को एक ही पृष्ठ तक पहुंचने के कारण एकाधिक थ्रेडिंग के कारण वे अलग-अलग मान प्राप्त कर सकते हैं कि उपयोगकर्ता किस समय पहुंच रहे हैं? –

+0

यह सही है। अब यह * हो सकता है कि आप इसे चाहते हैं। मुझे लगता है कि यह अक्सर दुर्घटना से किया जाता है। –

+0

तो इसका मतलब है कि इस बिंदु पर स्लैक सही है जिसका उपयोग नहीं किया जाना चाहिए। –

2

एएसपी.NET के साथ आवेदन स्तर पर सी # में स्थिर चर।

जहां तक ​​वे कितना मूल्य प्राप्त करेंगे, यह इस बात पर निर्भर करता है कि पृष्ठ स्थिर या स्थिर होने के बाद वे चर को एक्सेस करते हैं या नहीं। यदि वे स्थैतिक चर बदलने से पहले मान प्राप्त करते हैं, तो वे पुराने मान देखेंगे। यदि स्थिर चर बदल जाने के बाद उन्हें मूल्य मिलता है, तो उन्हें नया मान मिल जाएगा। एएसपी.नेट में स्टेटिक वेरिएबल परेशान हो सकते हैं, मैं सुझाव दूंगा कि वे केवल निरंतर मूल्यों के लिए या केवल पढ़ने योग्य, अपरिवर्तनीय कक्षाओं के लिए उपयोग किए जाएंगे।

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