2010-05-26 13 views

Respuesta

16

El método finalizador se llama ~name() reemplazar "nombre" con el nombre de la clase.

El compilador C# generará el finalizador a partir de esto.

Pero nota:

  1. utilizar sólo una finaliser si realmente lo necesita: el tipo de directamente contiene un recurso nativo (un tipo de componer un envoltorio simplemente utiliza el patrón Desechar).
  2. Considera la posibilidad de especializarte en SafeHandle en lugar de escribir la tuya propia.
  3. Implemente el patrón de disposición para permitir que las personas que llaman liberen el recurso rápidamente.
  4. Asegúrate de que tanto tu Dispose como el Finalizer son idempotentes — que se pueden llamar con seguridad varias veces.

e.g.

class MyClass : IDisposable { 
    private IntPtr SomeNativeResource; 

    ~MyClass() { 
    Dispose(false); 
    } 

    public void Dispose() { 
    Dispose(true); 
    } 

    protected virtual void Dispose(bool disposing) { 
    if (disposing) { 
     // Dispose any disposable fields here 
     GC.SuppressFinalize(this); 
    } 
    ReleaseNativeResource(); 
    } 
} 

subclases pueden anular Dispose(bool) añadir cualquiera de los campos de adición que añaden y llamar a la implementación base.

EDITADO: para agregar ejemplos y notas sobre cuándo finalizar.

+0

¿Se ha perdido **vacío**? –

+0

@LeiYang: Sí: dos veces. Y, después de casi 6 años (!), Ahora arreglado. – Richard

7

No es así.

Escuche el compilador. No debe anular Finalize. En su lugar, debe implementar IDisposible e invalidar Dispose.

A menos que necesite explícitamente liberar recursos guardados directamente por el objeto, debería poder hacer todo lo que necesite en el método Dispose.

Pero si es necesario:

public class MyClass 
{ 
    public MyClass() { ... } // Constructor 
    public ~MyClass() { ... } // Destructor/Finalizer 
} 

Sólo tenga cuidado porque finalizadores son difíciles y si se aplican incorrectamente puede llevar algo de sobrecarga de rendimiento bastante fuerte.

0

Escuche los errores del compilador, son sabios más allá de sus años (a menos que realmente necesite, en el raro caso, realmente meterse con el finalizador ... el nombre es un poco al revés en C#).

su lugar, debe aplicar Dispose(), haciendo que su clase implemente IDisposable, así:

public class MyClass : IDisposable 
{ 
    public void Dispose() 
    { 
    //cleanup 
    } 
} 

Luego, cuando la utilización de su clase, lo envuelve en un using, así:

using(var mc = new MyClass()) { 
//use it for things 
} //it gets disposed here 
+0

Luego, cuando la utilización de su clase, lo envuelve en un usando, como esto: usando (var mc = new MyClass()) {// lo utilizan para cosas } // Se pone aquí dispuesto favor elaborado. .... ya que no nos ha "usado" ... –

+0

@Ramakant - 'using()' que utiliza cuando quiere deshacerse de un objeto lo antes posible, como un manejador de archivo por ejemplo, como: 'using (var r = File.OpenText ("myFile.log")) {// hace cosas con el lector ..} ', al final de esa declaración, el manejador de archivo se cierra lo antes posible, liberando bloqueos y recursos. –

Cuestiones relacionadas