मैं using
कीवर्ड का उपयोग कर रहा है, तो मैं अभी भी IDisposable
को लागू करने के लिए क्या है?उपयोग करने वाले कीवर्ड और आईडीस्पोजेबल इंटरफ़ेस के बीच संबंध क्या है?
उत्तर
आप using
statement का उपयोग करते हैं संलग्न प्रकार पहले से ही लागू IDisposable
अन्यथा संकलक एक त्रुटि जारी करेगा चाहिए। तो उपयोग करने की एक शर्त होने के लिए IDisposable कार्यान्वयन पर विचार करें।
यदि आप अपनी कस्टम कक्षा पर using
कथन का उपयोग करना चाहते हैं, तो आपको इसके लिए IDisposable
लागू करना होगा। हालांकि यह ऐसा करने के लिए पिछड़ा है क्योंकि इसके लिए ऐसा करने का कोई मतलब नहीं है। केवल अगर आपके पास एक अप्रबंधित संसाधन की तरह निपटने के लिए कुछ है तो क्या आप इसे लागू करना चाहिए।
// To implement it in C#:
class MyClass : IDisposable {
// other members in you class
public void Dispose() {
// in its simplest form, but see MSDN documentation linked above
}
}
यह करने देता है:
using (MyClass mc = new MyClass()) {
// do some stuff with the instance...
mc.DoThis(); //all fake method calls for example
mc.DoThat();
} // Here the .Dispose method will be automatically called.
प्रभावी ढंग से कि लेखन के रूप में ही है:
MyClass mc = new MyClass();
try {
// do some stuff with the instance...
mc.DoThis(); //all fake method calls for example
mc.DoThat();
}
finally { // always runs
mc.Dispose(); // Manual call.
}
क्या आप एक कोड उदाहरण दिखा सकते हैं, कृपया? – Troy
@Troy: उदाहरण स्पष्टीकरण को हाइलाइट करने के लिए जोड़ा गया। –
असल में जब भी आपके पास "सैंडविच" कोड होता है, तो अंततः इसके लिए एक उपयोगी पैटर्न होता है जिसे अंत में अनुभाग में कुछ सामग्री निष्पादित/निष्पादित करनी चाहिए। उदाहरण के लिए एक सामान्य परिदृश्य एक व्यस्त कर्सर होगा, चरण हैं ... 1./मौजूदा कर्सर 2. कॉपी करें/कर्सर को अपने प्रतीक्षा कर्सर पर सेट करें 3./अंत में अनुभाग मूल को वापस कॉपी करें। के साथ एक का उपयोग करने और IDisposable आप तो का उपयोग कर की तरह कोड कुछ लिख सकता है (Busy.WaitCursor) { // कहाँ WaitCursor एक स्थिर संपत्ति है कि व्यस्त निर्माता प्रतियां और सेट और निपटाने का एक उदाहरण देता है() फिर से सेट। } –
आप भ्रमित बातें हैं। आप केवल उस चीज़ पर "उपयोग" कीवर्ड का उपयोग कर सकते हैं जो IDISposable लागू करता है।
संपादित करें: यदि आप कीवर्ड का उपयोग कर का उपयोग करते हैं, तो आप स्पष्ट रूप से निपटान आह्वान करने के लिए नहीं है, यह ब्लॉक का उपयोग के अंत में स्वचालित रूप से बुलाया जाएगा। अन्य ने पहले से ही उदाहरण पोस्ट कर दिए हैं कि कैसे उपयोग कथन का अंततः ब्लॉक में आवेदक के साथ, अंततः कथन का अनुवाद किया जाता है।
आप किसी रिकॉर्डसेट से डेटा पढ़ते समय "उपयोग" कीवर्ड का उपयोग कर सकते हैं, सही? – Troy
@ ट्रॉय, हां, ऐसा इसलिए है क्योंकि IDataReader IDISposable लागू करता है। –
केवल तभी जो कुछ भी आपके रिकॉर्डसेट को लपेट रहा है, वह IDISposable लागू करता है। यदि यह संकलित करता है तो यह IDISposable लागू करता है .... –
का उपयोग डिस्पोजेबल वस्तुओं की ही निपटाने होंगे। तो एक वस्तु है कि IDisposable को लागू नहीं करता है के चारों ओर एक का उपयोग कर ब्लॉक wraping वास्तव में एक संकलक त्रुटि का कारण होगा बल्कि बेकार है।
http://msdn.microsoft.com/en-us/library/yh598w02.aspx
As a rule, when you use an IDisposable object, you should declare and instantiate it in a using statement. The using statement calls the Dispose method on the object in the correct way, and it also causes the object itself to go out of scope as soon as Dispose is called. Within the using block, the object is read-only and cannot be modified or reassigned.
The using statement ensures that Dispose is called even if an exception occurs while you are calling methods on the object. You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; in fact, this is how the using statement is translated by the compiler.
वास्तव में, यह एक कंपाइलर त्रुटि है। – Timwi
आप दूसरे के बिना एक नहीं हो सकता।
जब आप लिखें:
using(MyClass myObj = new MyClass())
{
myObj.SomeMthod(...);
}
संकलक कुछ इस तरह उत्पन्न करेगा:
MyClass myObj = null;
try
{
myObj = new MyClass();
myObj.SomeMthod(...);
}
finally
{
if(myObj != null)
{
((IDisposable)myObj).Dispose();
}
}
तो जैसा कि आप जबकि using
कीवर्ड यह मान लिया/आवश्यक है कि IDisposable लागू किया गया है है होने देख सकते हैं। एक उपयोगी उदाहरण:
+1, लेकिन ग्रहण नहीं किया - आवश्यक है। आपके द्वारा यहां दिखाए गए कंपाइलर कोड को अमान्य कास्ट अपवाद के अलावा छोड़ दिया जाएगा यदि टाइप IDISposable लागू नहीं किया गया था। यही कारण है कि संकलक एक उपयोग में उपयोग के लिए, अनुमानित नहीं, अनुमानित, IDISposable आवश्यक संकलन समय त्रुटि देकर ऐसा होने से बचाता है। –
@ जिमी हाँ आप सही कह रहे हैं, मानते हुए मेरा मतलब था। उत्तर अपडेट किया गया है। – Incognito
हाँ, कीवर्ड का उपयोग पैटर्न के इस प्रकार के लिए वाक्यात्मक चीनी ... (MSDN से)
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
संपादित है।
आप पाते हैं जब आप वापस अपने डिफ़ॉल्ट करने के लिए यह एक प्रतीक्षा कर्सर करने के लिए सेट करने के बाद एक कर्सर को रीसेट consistantly एक अंत में खंड में चीज़ें कर रहे हैं, उदाहरण के लिए, इस इस पैटर्न के लिए एक उम्मीदवार है ...
public class Busy : IDisposable
{
private Cursor _oldCursor;
private Busy()
{
_oldCursor = Cursor.Current;
}
public static Busy WaitCursor
{
get
{
Cursor.Current = Cursors.WaitCursor;
return new Busy();
}
}
#region IDisposable Members
public void Dispose()
{
Cursor.Current = _oldCursor;
}
#endregion
}
की तरह कहा जाता है ...
using(Busy.WaitCursor)
{
// some operation that needs a wait cursor.
}
कीवर्ड का उपयोग पहले से ही लागू करता है, इसलिए यदि आप कीवर्ड का उपयोग का उपयोग करें, आप IDisposable
आप IDisposable का उपयोग कर उपयोग करने के लिए लागू करना चाहिए आह्वान करने के लिए नहीं है। आप निम्नलिखित संकलन समय त्रुटि हो आप() एक प्रकार पर कि IDisposable को लागू नहीं करता है का उपयोग कर का उपयोग करने का प्रयास करें:
error CS1674: 'SomeType': type used in a using statement must be implicitly convertible to 'System.IDisposable'
हो सकता है कि तुम क्या है पूछने के लिए, "मतलब अगर मैं 'का उपयोग' कीवर्ड का उपयोग मैं क्या अभी भी निपटान करना है()? –
यदि आप हैं, तो आप पहले से ही हैं। –
@ क्रिस किसान ... अच्छा संपादन। मुझे लगता है कि यह @Apple !!! – user279521