Какова связь между использованием ключевого слова и интерфейсом iDisposable?

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

Вопрос

Если я использую using ключевое слово, я все еще должен реализовать IDisposable?

Это было полезно?

Решение

Если вы используете using утверждение Закрытый тип должен уже реализовать 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.

Редактировать: Если вы используете ключевое слово «Использование», вам не нужно откровенно информировать, его будет называться автоматически в конце блока с использованием. Другие уже опубликовали примеры того, как использование оператора переводится в попыдку - наконец-то оператор, с Dispose, вызываемым в рамках окончательного блока.

Да, использование ключевого слова - синтаксический сахар для этого типа рисунка ... (от 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, вы должны объявить и создать его в использовании оператора. Использование оператора вызывает метод Dispose на объекте правильно, и он также вызывает свой объект, чтобы выйти из-за объема, как только вызовут распоряжение. В разделе «Использование блока» объект является только для чтения и не может быть изменено или переназначен.

Оператор «Использование» гарантирует, что распоряжение называется, даже если произойдет исключение, когда вы вызываете методы на объекте. Вы можете достичь того же результата, установив объект внутри блока попробуйте и затем вызовов распоряжение в наконец-то блоке; На самом деле, именно то, как оператор использования переведен компилятором.

Вы должны реализовать 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