2011-08-05 14 views
5

मैं ई in this stackoverflow questionसाथ सी # 'का उपयोग'

मैं कथन का उपयोग के बारे में उलझन हो रही है के साथ काम करने के लिए कुछ कोड को देखा है उलझन में। मैंने सोचा था कि यह सिर्फ चीजें हैं जो आप, स्मृति रिसाव हो सकता है चिंतित हैं एक WebClient, या इसी तरह की तरह के लिए इस्तेमाल किया गया था ...

वैसे भी

:

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
     using (var user = UserPrincipal.FindByIdentity(context, "username")) 
     { 
      var groups = user.GetAuthorizationGroups(); 
      ... 
     } 
} 

जब मैं सीमा तक पहुंच जाती var groups = user.GetAuthorizationGroups() - प्रयोक्ता खाली है , ताकि लाइन NullReference के साथ विफल हो। जब मैं इसे डिबगिंग पर माउस करता हूं तो यह शून्य दिखाता है, फिर स्टेटिक सदस्यों को दिखाता है, और इसमें सभी मान हैं।

यदि मैं कथन का उपयोग करने से लाइन लेता हूं और केवल var user = UserPrincipal.FindByIdentity(context, "username") उपयोगकर्ता आवश्यकतानुसार पॉप्युलेट किया गया है।

तो क्या चल रहा है ???

संपादित करें: मैं भर गया और एक फर्जी उपयोगकर्ता नाम भेज रहा था। विचित्र रूप से हालांकि जब मैं डीबग के दौरान चर की जांच करता हूं, तो जब आप बोगस उपयोगकर्ता आईडी भेजते हैं तो उपयोगकर्ता पूरी तरह से शून्य होने की अपेक्षा करता है, लेकिन यह उपयोगकर्ता के नीचे दिखाया गया है: शून्य, स्थिर सदस्य, और मेरे पास वर्तमान में लॉग इन किए गए मूल्यों के लिए मूल्य थे। तो मैंने सोचा कि यह संभावित रूप से उपयोग कथन के साथ करना था। चीयर्स!

+0

'उपयोग' कुछ भी है जो 'आईडीस्पोजेबल' लागू करता है। –

+0

अधिक सामान्य शब्दों में, आपको 'उपयोग' कथन (और इस प्रकार 'आईडीस्पोजेबल') के बारे में सोचना चाहिए * संसाधन लीक * को रोकने के लिए उपयोग किया जा रहा है। इस तरह के संसाधन अंततः "स्मृति" हैं लेकिन अधिक अमूर्त भावना (जैसे फ़ाइल हैंडल, डेटाबेस कनेक्शन इत्यादि) में नहीं होना चाहिए। –

+1

"उपयोग" कथन केवल उपयोग के दायरे के अंत में चर को प्रभावित करते हैं, जिस बिंदु पर यह चर का निपटान करता है। क्या आप वाकई अवैध उपयोगकर्ता नहीं हैं? (UserPrincipal के रूप में। FIindByIdentity शून्य नहीं लौटाता है) – Will

उत्तर

3

जो आप वर्णन कर रहे हैं वह नहीं हो सकता है। using कथन की विशेषता तब तक नहीं होती जब तक कि ब्लॉक पूरा नहीं हो जाता है, जब ऑब्जेक्ट का निपटारा किया जाता है। तो उस ब्लॉक के अंदर, user वैरिएबल इस पर ध्यान दिए बिना कि यह using कथन में है या नहीं।

1

उपयोग कथन यह सुनिश्चित करता है कि ऑब्जेक्ट पर विधियों को कॉल करते समय अपवाद तब भी होता है जब कोई अपवाद होता है। आप ऑब्जेक्ट को एक कोशिश ब्लॉक के अंदर डालकर और अंततः ब्लॉक में निपटान करके उसी परिणाम को प्राप्त कर सकते हैं; वास्तव में, इस प्रकार कथन का अनुवाद कंपाइलर द्वारा किया जाता है।

1

सी # "उपयोग" कथन एक सुविधाजनक वाक्यविन्यास प्रदान करता है जो आईडीस्पोजेबल ऑब्जेक्ट्स का सही उपयोग सुनिश्चित करता है। यह देखने के लिए जांचें कि प्रिंसिपल कॉन्टेक्स्ट में एक डिस्पोजेबल विधि है या IDISposable लागू करता है। यदि नहीं, तो आपको "उपयोग" का उपयोग नहीं करना चाहिए। अधिक जानकारी के लिए MSDN documentation देखें।

2

का उपयोग करने के लिए सिंटैक्टिक चीनी है, अंततः और स्वचालित रूप से कॉल करने वाले ऑब्जेक्ट्स को लागू करने वाली वस्तुओं पर निपटान करें।

+0

दरअसल, बस कोशिश करें/अंत में - कोई पकड़ नहीं है। (या यह है "क्या करें या नहीं, कोई कोशिश नहीं है")? –

+0

@ जो एनोस, आप बिल्कुल सही हैं। यह केवल कोशिश/आखिरकार है। उसे इंगित करने के लिए धन्यवाद। – Icarus

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