Pregunta

Si estoy usando la palabra clave using, todavía tengo para implementar IDisposable?

¿Fue útil?

Solución

Si utiliza la using comunicado del tipo cerrado ya debe aplicar IDisposable de lo contrario el problema compilador un error. Así que considera la aplicación IDisposable ser un requisito previo de utilizar.

Si desea utilizar la instrucción using en su clase personalizada, entonces usted debe implementar IDisposable por ello. Sin embargo, esto es una especie de retroceso a hacer porque no tiene sentido hacerlo por el bien de ella. Sólo si tiene algo para disponer de como un recurso no administrado debe ponerlo en práctica.

// 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
    }
}

Esto le permite:

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.

Efectivamente eso es lo mismo que escribir:

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. 
}

Otros consejos

No se puede tener uno sin el otro.

Cuando se escribe:

using(MyClass myObj = new MyClass())
{
    myObj.SomeMthod(...);
}

compilador generará algo como esto:

MyClass myObj = null;
try
{
    myObj = new MyClass();
    myObj.SomeMthod(...);
}
finally
{
    if(myObj != null)
    {
        ((IDisposable)myObj).Dispose();
    }
} 

Así como se puede ver, mientras que tener using palabra clave se asume / requiere que se implementa IDisposable.

Se está confundiendo las cosas. Sólo se puede utilizar el "uso" de palabras clave en algo que implementa IDisposable.

Editar: Si se utiliza el uso de palabras clave, que no tiene que invocar explícitamente botar, se llama automáticamente al final del uso de bloque. Otros ya han publicado ejemplos de cómo el uso de la declaración se traduce en un intento - por último comunicado, la Desechar invocada dentro del bloque finally

.

Sí, la palabra clave es el uso de azúcar sintáctico para este tipo de patrón ... (de MSDN)

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

Edit:. Un ejemplo útil

Cuando encuentre que está haciendo las cosas de una sección consistentemente por último, por ejemplo, restablecer una parte posterior del cursor a su valor predeterminado después de haber puesto a un cursor de espera, este es un candidato para este patrón ...

  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
  }

Llamado como ...

using(Busy.WaitCursor)
{
  // some operation that needs a wait cursor.
}

Usando sólo dispondrá de desechable objetos. Así wraping un bloque utilizando alrededor de un objeto que no implementa IDisposable es bastante inútil , de hecho, causa un error de compilación.

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

  

Como regla general, cuando se utiliza un IDisposable   objeto, se debe declarar y   instanciarlo en una instrucción using.   La instrucción using llama al botar   método en el objeto en la correcta   manera, y también hace que el objeto   sí para salir del alcance tan pronto como sea   Desechar se llama. Dentro del uso de   bloque, el objeto es de sólo lectura y   no puede ser modificado o reasignado.

     

Los que utilizan asegura declaración que   Desechar se llama incluso si una excepción   ocurre mientras usted está llamando métodos   en el objeto. Se puede lograr el   mismo resultado colocando el objeto   dentro de un bloque try y luego llamar   Desechar en un bloque finally; de hecho,   es así como la instrucción using es   traducido por el compilador.

Se debe implementar IDisposable utilizar usando. Si intenta utilizar el uso de () de un tipo que no implementa IDisposable se obtiene el siguiente error de tiempo de compilación:

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

El uso de palabras clave ya implementa, por lo que si se utiliza el uso de palabras clave, usted no tiene que invocar IDisposable

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top