ما هي العلاقة بين استخدام الكلمة الرئيسية وواجهة Idisposable؟

StackOverflow https://stackoverflow.com/questions/3544758

سؤال

إذا كنت أستخدم using الكلمة الرئيسية ، هل ما زلت مضطرًا للتنفيذ IDisposable?

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

المحلول

إذا كنت تستخدم using بيان يجب أن ينفذ النوع المرفق بالفعل 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. 
}

نصائح أخرى

لا يمكنك الحصول على واحدة بدون الآخر.

عندما تكتب :

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.

أنت مربكة. يمكنك فقط استخدام الكلمة الرئيسية "استخدام" على شيء ينفذ idisposable.

تحرير: إذا كنت تستخدم الكلمة الأساسية باستخدام ، فلن تضطر إلى التخلص من التخلص من التخلص ، فسيتم استدعاؤه تلقائيًا في نهاية الكتلة. قام آخرون بالفعل بنشر أمثلة على كيفية ترجمة بيان استخدام إلى تجربة - في النهاية ، مع التخلص من التخلص منها داخل الكتلة أخيرًا.

نعم ، الكلمة الأساسية هي السكر النحوي لهذا النوع من النمط ... (من MSDN)

  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }

تحرير: مثال مفيد.

عندما تجد أنك تقوم بأشياء في قسم أخيرًا ، على سبيل المثال ، إعادة تعيين المؤشر مرة أخرى إلى افتراضيه بعد تعيينه على مؤشر الانتظار ، هذا مرشح لهذا النمط ...

  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 لا طائل منه إلى حد ما في الواقع سيسبب خطأ في المترجم.

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

كقاعدة عامة ، عندما تستخدم كائنًا قابلًا للعلاج ، يجب أن تعلن وتشكيله في بيان باستخدام. يستدعي البيان استخدام طريقة التخلص من الكائن بالطريقة الصحيحة ، كما أنه يتسبب في خروج الكائن نفسه عن النطاق بمجرد استدعاء التخلص منها. ضمن الكتلة باستخدام الكائن ، يكون القراءة فقط ولا يمكن تعديله أو إعادة تعيينه.

يضمن البيان استخدام أن التخلص من التخلص يسمى حتى في حالة حدوث استثناء أثناء استدعاء طرق الكائن. يمكنك تحقيق نفس النتيجة عن طريق وضع الكائن داخل كتلة المحاولة ثم الاتصال بالتخلص في كتلة أخيرًا ؛ في الواقع ، هذه هي الطريقة التي يتم بها ترجمة البيان باستخدام المترجم.

يجب عليك تنفيذ idisposable لاستخدامها. إذا حاولت استخدام استخدام () على نوع لا ينفذ idisposable ، فستحصل على خطأ وقت الترجمة التالي:

error CS1674: 'SomeType': type used in a using statement must be implicitly convertible to 'System.IDisposable'

الكلمة الأساسية التي تستخدمها بالفعل ، لذلك إذا كنت تستخدم الكلمة الرئيسية ، فلن تضطر إلى استدعاء idisposable

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