سؤال

لدي فئة (قل MyClass) يستخدم (لديه كحقل خاص) TcpClient هدف. MyClass تنفذ IDisposable دعا TcpClient.Close في ال Dispose طريقة.

سؤالي هو يجب MyClass تنفذ أيضا النهائي للاتصال Dispose(bool Disposing) لتحرير TcpClient’s الموارد غير المدارة في القضية MyClass.Dispose لا يطلق عليه رمز الاتصال؟

شكرا

هل كانت مفيدة؟

المحلول

لا يجب عليك ذلك.

لأن يجب ألا تستدعي طريقة على كائن آخر في النهائي, ، كان من الممكن الانتهاء من الكائن الخاص بك.

سيتم استدعاء النهادة من Tcpclient الخاص بك من قبل جامع القمامة، لذلك دعه يفعل.

النمط في التخلص هو:

protected virtual void Dispose(bool disposing)
{
   if (disposing)
   { 
      // dispose managed resources (here your TcpClient)
   }

   // dispose your unmanaged resources 
   // handles etc using static interop methods.
}

نصائح أخرى

لا يجب عليك ذلك.

من هذه وظيفة ممتازة:

الانتهاء يختلف بشكل أساسي عن إنهاء عمر كائن. من وجهة نظر صحة صحة، لا يوجد طلب بين النهائي (خارج حالة خاصة للنظارات النهائية النقدية)، لذلك إذا كان لديك كائنين يفكران في GC ماتوا في نفس الوقت، فلا يمكنك التنبؤ بما سيكمله النهائي أولا. هذا يعني أنه لا يمكنك الحصول على نهائي يتفاعل مع أي كائنات نهائية مخزنة في متغيرات المثيل.

هذا هو التنفيذ المرجعي لنمط القابل للتصرف / وضع اللمسات الأخيرة مع تعليقات موضحة عند استخدام ما:

/// <summary>
    /// Example of how to implement the dispose pattern.
    /// </summary>
    public class PerfectDisposableClass : IDisposable
    {
        /// <summary>
        /// Type constructor.
        /// </summary>
        public PerfectDisposableClass()
        {
            Console.WriteLine( "Constructing" );    
        }

        /// <summary>
        /// Dispose method, disposes resources and suppresses finalization.
        /// </summary>
        public void Dispose()
        {
            Dispose( true );
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Disposes resources used by class.
        /// </summary>
        /// <param name="disposing">
        /// True if called from user code, false if called from finalizer.
        /// When true will also call dispose for any managed objects.
        /// </param>
        protected virtual void Dispose(bool disposing)
        {
            Console.WriteLine( "Dispose(bool disposing) called, disposing = {0}", disposing );

            if (disposing)
            {
                // Call dispose here for any managed objects (use lock if thread safety required), e.g.
                // 
                // if( myManagedObject != null )
                // {
                //     myManagedObject.Dispose();
                //     myManagedObject = null;
                //  }
            }
        }

        /// <summary>
        /// Called by the finalizer.  Note that if <see cref="Dispose()"/> has been called then finalization will 
        /// have been suspended and therefore never called.
        /// </summary>
        /// <remarks>
        /// This is a safety net to ensure that our resources (managed and unmanaged) are cleaned up after usage as
        /// we can guarantee that the finalizer will be called at some point providing <see cref="Dispose()"/> is
        /// not called.
        /// Adding a finalizer, however, IS EXPENSIVE.  So only add if using unmanaged resources (and even then try
        /// and avoid a finalizer by using <see cref="SafeHandle"/>).
        /// </remarks>
        ~PerfectDisposableClass()
        {
            Dispose(false);
        }
    }

لا ليس لديك. Tcpclient هو فئة مجمع حول المقبس غير المدار وهناك تدار لأنه يجب التخلص منه. ما فعلته هو ما يكفي.

نعم يجب عليك - مايكروسوفت توصي ذلك.

فقط تذكر أن كود الحزام والحمالات لا يتطلب منك أبدا في المكتب في الساعة 2:00 صباحا :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top