سؤال

لدي فئة تسمى قواعد البيانات التي تلتف DBCONNECTION. ما هي الطريقة الصحيحة لإعداد هذه الفئة لبيان الاستخدام؟ لقد قمت بتنفيذ مثبتة، لكنني لست متأكدا متى وأين يجب أن أتصل بالاتصال. close () أو Connection.dispose ().

عندما أقوم ببساطة باستدعاء Connection.dispose () في طريقة التخلص الخاصة بي ()، سأحصل أحيانا على SocketException من كائن DBConnection الخاص بي. أفترض أن هذا لأن الاتصالات القديمة يتم تركها مفتوحة، ولكن لا توجد تفاصيل متصلة باستثناء، لذلك لا أستطيع أن أعرف بالتأكيد.

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

المحلول

Call Connection.dispose () من داخل طريقة التخلص الخاصة بك. يجب عليك إلقاء نظرة على النمط القياسي لتنفيذ IDEAPOPOBLE، مما يتقدم إلى ما بعده ببساطة تطبيق الواجهة غير القابلة للانهيا ويسمح بالتخلص من الكائنات غير المدارة وما إلى ذلك:

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Dispose managed resources.
        }

        // There are no unmanaged resources to release, but
        // if we add them, they need to be released here.
    }
    disposed = true;

    // If it is available, make the call to the
    // base class's Dispose(Boolean) method
    base.Dispose(disposing);
}

(مأخوذ من http://msdn.microsoft.com/en-us/library/system.idisable.aspx.).

نصائح أخرى

وفق هذه أخبار المجموعة:

فيما يلي كيفية تنفيذ IDBConnection.dispose () (كما تظهر الأداة المساعدة العاكس):

sqlclient:

protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             switch (this._objectState)
             {
                   case ConnectionState.Open:
                   {
                         this.Close();
                         break;
                   }
             }
             this._constr = null;
       }
       base.Dispose(disposing);
}

Odbc:
protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             this._constr = null;
             this.Close();
             CNativeBuffer buffer1 = this._buffer;
             if (buffer1 != null)
             {
                   buffer1.Dispose();
                   this._buffer = null;
             }
       }
       base.Dispose(disposing);
}

OleDb:
protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             if (this.objectState != 0)
             {
                   this.DisposeManaged();
                   if (base.DesignMode)
                   {
                         OleDbConnection.ReleaseObjectPool();
                   }
                   this.OnStateChange(ConnectionState.Open, ConnectionState.Closed);
             }
             if (this.propertyIDSet != null)
             {
                   this.propertyIDSet.Dispose();
                   this.propertyIDSet = null;
             }
             this._constr = null;
       }
       base.Dispose(disposing);
}

يجب أن تحاول طريقة التخلص من الخاص بك فقط إغلاق الاتصال إذا كان مفتوحا.

هذا بناء جملة Destructor هو الواقع النهائي. التأثير النهائي هو استدعاء طريقة التخلص (FALSE).

    #region IDisposable Members
    private bool _isDisposed;

    private void ThrowIfDisposed()
    {
        if (_isDisposed)
            throw new ObjectDisposedException(this.GetType().Name);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_isDisposed)
        {
            if (disposing)
            {
                //part 1 : disposing managed objects
                _command.Dispose();
                _command.Connection.Dispose();
                if (_command.Transaction != null)
                    _command.Transaction.Dispose();
            }
            //part 2: disposing unmanged objects. Here there are no unmanged objects.
            _isDisposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    //~DbCommandExecutor() //No need of finalize here. Because there is no unmanged objects in my class. ie, no code in part 2.
    //{
    //    Dispose(false);
    //}
    #endregion

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

مقارنة الأمثلة: من MSDN

http://msdn.microsoft.com/en-us/library/system.idisposable.dispos.aspx. & http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx.

فقط لإكمال نمط التنفيذ القابل للانهناء، فإن الاتفاقية لتضمين نهادة (Destructor) لفصلك الذي يستدعي طريقة التخلص () (تمرير FALSE). وهذا يعمل كآلية Failsafe، مما يتيح لك التخلص من الأشياء غير المدارة إذا فشل المستهلك في الفصل في استدعاء ().

    ~MyClass() 
    {
        Dispose(false);
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top