दिलचस्प पोस्ट
विंडो स्क्रॉल एनीमेशन की सीएसएस मूल्य सीमा निर्धारित करना एडीबी का प्रयोग करके एंड्रॉइड फोन पर एक चुटकी में / आउट कमांड फायर करें var फ़ंक्शननाम = समारोह () {} बनाम फ़ंक्शन functionName () {} प्लगिंग लाइन और जीजीप्लोट 2 में समूह सौंदर्य प्रिंट संवाद के बिना विंडोज़ सेवा से एचटीएमएल दस्तावेज़ प्रिंट करें आईओएस पता लगाता है कि उपयोगकर्ता iPad पर है या नहीं मैं jQuery के साथ एक अलग पोर्ट पर AJAX अनुरोध कैसे भेजूं? पेजर का उपयोग करने से मैं git diff को कैसे रोकूं? प्रत्येक आईडी के लिए अधिकतम मूल्य प्राप्त करने के लिए साधारण क्वेरी एंड्रॉइड: एंड्रॉइड कैमरा पूर्वावलोकन पर ओवरले बैच स्क्रिप्ट के भीतर से मैं एक रजिस्ट्री कुंजी का मान कैसे प्राप्त करूं? सी में दो दशमलव स्थानों को गोलाई संख्या SQLite में तभी तालिका बनाएँ, अगर वह पहले से मौजूद नहीं है Android में JSON को ऑब्जेक्ट कनवर्ट करें Android XML प्रतिशत प्रतीक

IDisposable को सही ढंग से कार्यान्वित करना

मेरी कक्षाओं में मैं आईडीिसपोजेज को लागू करता हूं:

public class User : IDisposable { public int id { get; protected set; } public string name { get; protected set; } public string pass { get; protected set; } public User(int UserID) { id = UserID; } public User(string Username, string Password) { name = Username; pass = Password; } // Other functions go here... public void Dispose() { // Clear all property values that maybe have been set // when the class was instantiated id = 0; name = String.Empty; pass = String.Empty; } } 

वीएस2012 में, मेरा कोड विश्लेषण सही तरीके से IDisposable को लागू करने के लिए कहता है, लेकिन मुझे यकीन नहीं है कि मैंने यहाँ क्या गलत किया।
सटीक पाठ इस प्रकार है:

CA1063 IDisposable को सही ढंग से लागू करें 'उपयोगकर्ता' पर डिस्पोज़ करें (बूल) के एक ओवर्रिडेटिव कार्यान्वयन प्रदान करें या प्रकार को सील के रूप में चिह्नित करें निपटाने के लिए एक कॉल (गलत) केवल मूल संसाधनों को साफ करना चाहिए निपटाने के लिए एक कॉल (सच) दोनों को प्रबंधित और मूल संसाधनों को साफ करना चाहिए। स्टैमन यूजरकैस 10

संदर्भ के लिए: CA1063: IDisposable सही ढंग से लागू करें

मैंने इस पेज के माध्यम से पढ़ा है, लेकिन मुझे डर है कि मैं वास्तव में नहीं समझता कि यहां क्या किया जाना चाहिए।

यदि कोई व्यक्ति अधिक लॅमेन्स में समझा सकता है तो समस्या क्या है और / या कैसे विकसित किया जाना चाहिए, जो वास्तव में मददगार होगा!

Solutions Collecting From Web of "IDisposable को सही ढंग से कार्यान्वित करना"

यह सही क्रियान्वयन होगा, हालांकि मुझे आपके द्वारा पोस्ट किए गए कोड में निपटने के लिए कुछ भी नहीं दिख रहा है। आपको केवल IDisposable लागू IDisposable आवश्यकता है जब:

  1. आपके पास अप्रबंधित संसाधन हैं
  2. आप उन चीजों के संदर्भों पर पकड़ रहे हैं जो खुद को डिस्पोजेबल हैं

आपके द्वारा पोस्ट किए गए कोड में कुछ भी निपटाए जाने की आवश्यकता नहीं है।

 public class User : IDisposable { public int id { get; protected set; } public string name { get; protected set; } public string pass { get; protected set; } public User(int userID) { id = userID; } public User(string Username, string Password) { name = Username; pass = Password; } // Other functions go here... public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { // free managed resources } // free native resources if there are any. } } 

सबसे पहले, आपको string और int साफ करने की आवश्यकता नहीं है – उन्हें कचरा कलेक्टर द्वारा स्वचालित रूप से ध्यान रखा जाएगा। केवल एक चीज जिसे Dispose में साफ करने की जरूरत है, अप्रबंधित संसाधन या प्रबंधित रीसट्रिक्स जो कि आईडीिसपोजेबल को कार्यान्वित करते हैं।

हालांकि, यह मानते हुए कि यह सिर्फ एक सीखने का अभ्यास है, IDisposable को कार्यान्वित IDisposable का अनुशंसित तरीका यह है कि यह सुनिश्चित करने के लिए कि किसी भी संसाधन का दो बार निपटारा नहीं किया जाता है, "सुरक्षा कैच" जोड़ना है:

 public void Dispose() { Dispose(true); // Use SupressFinalize in case a subclass // of this type implements a finalizer. GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // Clear all property values that maybe have been set // when the class was instantiated id = 0; name = String.Empty; pass = String.Empty; } // Indicate that the instance has been disposed. _disposed = true; } } 

निम्न उदाहरण IDisposable इंटरफ़ेस को लागू IDisposable लिए सामान्य सर्वोत्तम अभ्यास दिखाता है। संदर्भ

ध्यान रखें कि आपको एक विनाशक की जरूरत है (अंतिम) केवल अगर आपके पास अपनी कक्षा में अप्रबंधित संसाधन हैं और यदि आप किसी डिस्ट्रक्टर को जोड़ते हैं तो आपको डिस्पोजेबल में अंतिम रूप देना चाहिए , अन्यथा यह आपकी ऑब्जेक्ट्स मेमोरी में दो कचरा चक्रों के लिए रहता है (नोट: पढ़ें कि अंतिम रूप कैसे काम करता है )। नीचे दिए गए सभी उदाहरणों को विस्तृत करें

 public class DisposeExample { // A base class that implements IDisposable. // By implementing IDisposable, you are announcing that // instances of this type allocate scarce resources. public class MyResource: IDisposable { // Pointer to an external unmanaged resource. private IntPtr handle; // Other managed resource this class uses. private Component component = new Component(); // Track whether Dispose has been called. private bool disposed = false; // The class constructor. public MyResource(IntPtr handle) { this.handle = handle; } // Implement IDisposable. // Do not make this method virtual. // A derived class should not be able to override this method. public void Dispose() { Dispose(true); // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SupressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if(!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if(disposing) { // Dispose managed resources. component.Dispose(); } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. CloseHandle(handle); handle = IntPtr.Zero; // Note disposing has been done. disposed = true; } } // Use interop to call the method necessary // to clean up the unmanaged resource. [System.Runtime.InteropServices.DllImport("Kernel32")] private extern static Boolean CloseHandle(IntPtr handle); // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~MyResource() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } } public static void Main() { // Insert code here to create // and use the MyResource object. } } 

IDisposable संसाधनों को साफ करने के लिए आपके लिए एक साधन प्रदान करने के लिए IDisposable मौजूद है जो कचरा कलेक्टर द्वारा स्वचालित रूप से साफ नहीं किए जाएंगे।

आप जिन सभी संसाधनों को "साफ कर रहे हैं" प्रबंधित संसाधन हैं, और जैसे आपकी Dispose पद्धति कुछ भी नहीं हासिल कर रही है आपकी कक्षा को IDisposable बिल्कुल भी लागू नहीं करना चाहिए। कचरा कलेक्टर उन सभी क्षेत्रों का ध्यान रखेगा जो सिर्फ अपने दम पर ठीक है।

आपको इस तरह डिस्पोजेबल पैटर्न का उपयोग करने की आवश्यकता है:

 private bool _disposed = false; protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // Dispose any managed objects // ... } // Now disposed of any unmanaged objects // ... _disposed = true; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } // Destructor ~YourClassName() { Dispose(false); } 

आपको अपने यूजर क्लास को आईडीसीपोज़ोज़ योग्य बनाने की कोई ज़रूरत नहीं है क्योंकि क्लास को कोई गैर-प्रबंधित संसाधन (फ़ाइल, डेटाबेस कनेक्शन आदि) प्राप्त नहीं होता है। आम तौर पर, हम कक्षाओं को आईडीिसपोजेज के रूप में चिह्नित करते हैं यदि उनके पास कम से कम एक IDisposable फ़ील्ड या / और संपत्ति है। IDisposable को लागू करते समय, बेहतर माइक्रोसॉफ्ट ठेठ योजना के अनुसार इसे डाल:

 public class User: IDisposable { ... protected virtual void Dispose(Boolean disposing) { if (disposing) { // There's no need to set zero empty values to fields // id = 0; // name = String.Empty; // pass = String.Empty; //TODO: free your true resources here (usually IDisposable fields) } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } 

जब भी आप एक नियतात्मक (पुष्टि) कचरा संग्रह चाहते हैं, तब व्यर्थ पारदर्शी कार्यान्वित होता है।

 class Users : IDisposable { ~Users() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); // This method will remove current object from garbage collector's queue // and stop calling finilize method twice } public void Dispose(bool disposer) { if (disposer) { // dispose the managed objects } // dispose the unmanaged objects } } 

प्रयोक्ता वर्ग का उपयोग और उपयोग करते समय स्पष्ट रूप से कॉल निपटान विधि से बचने के लिए "प्रयोग" ब्लॉक का उपयोग करें:

 using (Users _user = new Users()) { // do user related work } 

उपयोग किए गए ब्लॉकों का अंत उपयोगकर्ता ऑब्जेक्ट का निपटान विधि का निपटान करने के लिए किया जाएगा।