¿Cuál es la relación entre el uso de palabras clave y la interfaz IDisposable?
-
30-09-2019 - |
Pregunta
Si estoy usando la palabra clave using
, todavía tengo para implementar IDisposable
?
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