2010-10-03 9 views
7

एक वस्तु का एहसास है, तो सी # में IDisposable एकएक सी # कीवर्ड का उपयोग कर रहा है?

using(DisposableFoo foo = new DisposableFoo()) 

लिख सकते हैं मैं हमेशा आश्चर्य किया है कि क्यों using एक सी # कीवर्ड की तरह लग रहा है, लेकिन एक अंतरफलक नेट ढांचे में परिभाषित की आवश्यकता है। using एक कीवर्ड है (इस संदर्भ में, जाहिर है कि यह आपके लाइब्रेरी आयात को परिभाषित करने के लिए है), या माइक्रोसॉफ्ट ने विजुअल स्टूडियो/नेट फ्रेमवर्क में इसका उपयोग अधिभारित किया है? मैं एक पुस्तकालय पर निर्भर करने के लिए एक सी # कीवर्ड की उम्मीद नहीं की थी।

+6

मैं नहीं दिख रहा है एक कीवर्ड एक इंटरफ़ेस को लागू करने के लिए अपने "तर्कों" की आवश्यकता होती है के साथ समस्या क्या। 'foreach' भी एक कीवर्ड है और संग्रह को' IENumerable' होने की आवश्यकता है। – sepp2k

+3

@ sepp2k - पैडेंट पॉइंट: आपको * foreach के लिए IENumerable की आवश्यकता नहीं है। –

+0

@Marc Gravell: आपका क्या मतलब है? एक एमएसडीएन लिंक के अनुसार यह कहता है "सिस्टम। चयन। INumerable या System.Collections.Generic.IEnumerable " http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx –

उत्तर

6

हां, यह एक कीवर्ड है। सी # भाषा कई कीवर्ड लागू करने के लिए ढांचे पर निर्भर करती है।

अन्य कीवर्ड उस ढांचे पर भरोसा करते हैं उदाहरण के foreach (IEnumerable उपयोग करता है) और LINQ वाक्यविन्यास (जब वस्तुओं के लिए LINQ के साथ प्रयोग किया System.Linq पुस्तकालय की आवश्यकता है) के लिए है।

यहां तक ​​कि int और string जैसे कीवर्ड ढांचे में System.Int32 और System.String पर भरोसा करते हैं।

+3

वास्तव में असामान्य है * क्योंकि * यह एक इंटरफ़ेस की मांग करता है। आप किसी भी विशेष पुस्तकालयों के बिना आईएनयूमेरेबल और LINQ के बिना foreach का उपयोग कर सकते हैं (इसे वास्तव में एक्सटेंशन विधियों की भी आवश्यकता नहीं है) –

+1

@ मार्क ग्रेवेल: मुझे लगता है कि यह वास्तव में foreach है कि यह असामान्य है क्योंकि यह एक बतख टाइपिंग का उपयोग करता है जो सी # के लिए अनैच्छिक है। , जिसके लिए IENumerable के कार्यान्वयन की आवश्यकता है, लेकिन वास्तविक इंटरफ़ेस नहीं। मैं स्पष्ट करता हूं कि यह LINQ से ऑब्जेक्ट्स है जिसके लिए System.Linq लाइब्रेरी की आवश्यकता होती है। – Guffa

+0

@guffa LINQ का अर्थ भाषा क्वेरी वाक्यविन्यास को किसी विशिष्ट पुस्तकालय की आवश्यकता नहीं है। मैं एक सी # 3/.net 2.0 कंसोल ऐप लिख सकता हूं जो LINQ क्वेरी सिंटैक्स का उपयोग करता है। –

1

मैं का उपयोग कर लगता है कि एक कीवर्ड कि अनिवार्य रूप से

B b= new B(); 
try{ 
A a= new A(); 
C c= new C();//B isn't here since 

SomeCode//execute the code 

}finallly{ 
a.Dispose();//The reason A,B,C need to implement IDisposable 
b.Dispose();//is so the compiler can make sure that they can call Dispose() 
c.Dispose(); 
} 

क्यों IDisposable प्रयोग किया जाता है के साथ महत्वपूर्ण बिट है, क्योंकि सी # दृढ़ता से लिखा गया में अपने कोड

B b=new B();//can get resource outside using statement but will dispose inside of it 
using(A a=new A(),b,C c=new C() //A,B,C are variable of types that implement IDisposable){ 
SomeCode//Some code to execute 
} 

बनाने के लिए, दृश्यों अपनी बुला के पीछे है निपटान(), और IDISposable लागू करने वाला संकलक यह बता सकता है कि यह कर सकता है।

आईन्यूमेरेबल और आईन्यूमेरेटर (GetEnumerator(), Current(), MoveNext() को कॉल करने के समान कैसे है, हालांकि मुझे लगता है कि यह केवल संग्रह कक्षाओं के साथ ऐसा नहीं करता है)।

+0

मुझे लगता है कि उपयोग (ए = एक नया ए(), सी सी = नया सी()) काम नहीं करेगा। कंपाइलर इस संदेश को लौटाता है: "एक से अधिक प्रकार का उपयोग, उपयोग, या घोषणा कथन में नहीं कर सकता।" मुझे पता है कि यह सिर्फ एक विवरण है जो आप समझा रहे थे, लेकिन किसी ने इसका उल्लेख नहीं किया और यही वह है जिसे मैं ढूंढ रहा था। – Alpha

8

यह एक कीवर्ड निर्माण है जिसके लिए एक आईडीस्पोजेबल की आवश्यकता होती है, क्योंकि यह ऑब्जेक्ट की डिस्प्ले विधि पर कार्य करता है। कीवर्ड को एक प्रकार का उपयोग करने के लिए यह बहुत दूर नहीं है। यदि कोई कीवर्ड है और इसे एक शर्त (आईई: बूलियन) प्रकार की आवश्यकता है।

4

सी # CLI को बारीकी से परी जुड़ा हुआ है, और भाषा कल्पना क्रम सुविधाओं की एक न्यूनतम को अपनाता है। "उपयोग" के लिए IDISposable वास्तव में असामान्य रूप से कठोर है, क्योंकि ज्यादातर मामलों में (उदाहरण के लिए "foreach", LINQ, आदि) विशिष्ट रनटाइम कार्यान्वयन के साथ और बिना दोनों का समर्थन करता है।

हालांकि, चूंकि IDISposable/उपयोग निर्माण .NET के लिए महत्वपूर्ण है, मुझे संदेह है कि आप इसके बिना एक न्यूनतम (लेकिन कानूनी) सीएलआई भी बना सकते हैं, इसलिए भाषा की कल्पना में इसका उल्लेख करना वास्तव में कोई समस्या नहीं है।

अन्य चीजें हैं जो विशेष प्रकार के लिए टाई:

  • स्ट्रिंग संयोजन (+ स्ट्रिंग बनाम।Concat)
  • विस्तार तरीकों
  • सामान्य नई()
  • [Serializable] (एक आईएल ध्वज को नक्शे, नहीं एक विशेषता)
  • foreach (लेकिन इंटरफेस के किसी भी बिना इस्तेमाल किया जा सकता)
  • कोर आधार प्रकार (Enum सरणी वस्तु ValueType प्रतिनिधि)
  • अभिव्यक्ति-वृक्ष संकलक (लेकिन न ही कल्पना में वर्णित)

आदि

2

हां, .NET ढांचे में भाषा और समर्थन असेंबली के बीच निश्चित रूप से युग्मन होता है। अब तक सबसे महत्वपूर्ण एक mscorlib.dll है, सिस्टम के लिए घर .IDisposable इंटरफ़ेस घोषणा। यह इतना महत्वपूर्ण है कि यह आपके सी # प्रोजेक्ट के संदर्भ नोड में भी सूचीबद्ध नहीं है। सी # कंपाइलर मानता है कि इसे हमेशा जरूरी है और इसे स्वयं ही मिल जाएगा, जब तक कि आप विशेष/nostdlib संकलन विकल्प का उपयोग न करें।

वाक्यात्मक तत्वों से उसके लिए आवश्यक के अन्य उदाहरण:

  • सरणी [], System.Array की आवश्यकता है
  • [गुण], System.Attribute
  • पकड़ की आवश्यकता है, System.Exception
  • की आवश्यकता है प्रतिनिधि, सिस्टम की आवश्यकता है। MulticastDelegate
  • प्रकार ?, सिस्टम की आवश्यकता है। शून्य <>
  • पैराम्स, आर equires System.ParamArrayAttribute
  • typeof, की आवश्यकता है System.Type

सभी बुनियादी प्रकार और mscorlib में उनके समतुल्य घोषणा (Int32, स्ट्रिंग, वस्तु, ValueType आदि की तरह) के बीच युग्मन है।

बाद के उदाहरण लिंकक क्वेरी समझ वाक्यविन्यास हैं, सिस्टम.कोर.dll, और गतिशील कीवर्ड की आवश्यकता है, जिसके लिए Microsoft.CSharp.dll की आवश्यकता है। ये उदाहरण किसी भी तरह से पूर्ण नहीं हैं।

यह अन्यथा सामान्य है, यहां तक ​​कि सी कंपाइलर्स मानते हैं कि रनटाइम लाइब्रेरी प्राइमेटिव्स जैसे memset() और ldiv() के साथ उपलब्ध है।

1

using एक सी # कीवर्ड है जो IDISposible वस्तुओं से निपटने के लिए एक वाक्य रचनात्मक-चीनी के रूप में कार्य करता है। एमएसडीएन

ब्लॉक का उपयोग करके एक गुंजाइश परिभाषित करता है, जिसके बाहर किसी ऑब्जेक्ट या ऑब्जेक्ट का निपटारा किया जाएगा।

उपयोग कथन प्रोग्रामर को यह निर्दिष्ट करने की अनुमति देता है कि संसाधनों का उपयोग करने वाली वस्तुओं को उन्हें छोड़ देना चाहिए। उपयोग कथन को प्रदान की गई वस्तु को IDISposable इंटरफ़ेस को लागू करना होगा। यह इंटरफ़ेस निपटान विधि प्रदान करता है, जिसे ऑब्जेक्ट के संसाधनों को छोड़ना चाहिए।

आश्चर्यजनक रूप से यहां तक ​​कि एमएसडीएन यह भी स्पष्ट नहीं करता है कि यह हुड के नीचे कैसे होता है। यह केवल इतना कहता है कि ऑब्जेक्ट को IDISposable इंटरफ़ेस को कार्यान्वित करना है जो इंटरफ़ेस को लागू करने वाले ऑब्जेक्ट पर निपटान विधि प्रदान करता है।तो ऑब्जेक्ट को निपटाने के लिए उसे उस ऑब्जेक्ट पर निपटान विधि को कॉल करने की आवश्यकता होगी जो ऑब्जेक्ट द्वारा उपयोग किए गए संसाधनों को साफ़ और रिलीज़ करेगी।

.. इस उदाहरण पर एक नजर डालें

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace BlogSamples 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Assume that Car is IDisposible. 
      using (Car myCar = new Car(1)) 
      { 
       myCar.Run(); 
      } 
     } 
    } 
} 

संकलक कोड में धर्मान्तरित इस तरह देखने के लिए ..

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace BlogSamples 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Declare myCar object with FullName of the type as seen in IL. 
      BlogSamples.Car myCar; 

      //Instantiate the object by calling the constructor, matching the flow of IL. 
      myCar = new Car(1); 

      try 
      { 
       myCar.Run(); 
      } 
      finally 
      { 
       if(myCar != null) 
        myCar.Dispose(); 
      } 
     } 
    } 
} 

हुड के नीचे कैसे वास्तव में ब्लॉक का उपयोग कर काम करता है समझने के लिए, मेरा सुझाव है आपने यह blog-post पढ़ा है।

http://www.ruchitsurati.net/index.php/2010/07/28/understanding-%E2%80%98using%E2%80%99-block-in-c/

+1

दरअसल, मैं कहूंगा कि यह अच्छी बात है कि एमएसडीएन यह नहीं कहता कि हुड के नीचे क्या होता है। काफी कुछ चीजें एमएसडीएन विवरण स्पष्टीकरण के तरीके के बिना कार्यान्वयन के विवरण को बिना किसी कार्यान्वयन के विवरण के बारे में बताते हैं, और क्या आवश्यक है (जब मूल्य और संदर्भ प्रकार की बात आती है तो ढेर बनाम ढेर एक क्लासिक उदाहरण होगा)। यह अलग-अलग तरीके से अलग होने पर कुछ तरीकों से अच्छा होगा। यदि यह ** ** ** विस्तृत कार्यान्वयन जो अच्छा होगा, लेकिन मैं मानक पाठ विवरण मानक जानकारी प्राप्त करना पसंद करता हूं। –

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