2011-01-20 8 views
5

yo estaba trabajando a través de un ejemplo y vi esto ...poniendo una tilde delante de una llamada a un método?

#if DEBUG 
    /// <summary> 
    /// Useful for ensuring that ViewModel objects are properly garbage collected. 
    /// </summary> 
    ~ViewModelBase() 
    { 
     string msg = string.Format("{0} ({1}) ({2}) Finalized", this.GetType().Name, this.DisplayName, this.GetHashCode()); 
     System.Diagnostics.Debug.WriteLine(msg); 
    } 
#endif 

Traté de Google, pero no pudo conseguir ningún resultado ... Me preguntaba lo que significa. ¿Nadie sabe?

Gracias

+0

posible duplicado de [¿Qué significa la tilde (~) en C#?] (Http://stackoverflow.com/questions/188688/what-does-the-tilde-mean-in-c) –

+1

Debe aceptar respuestas a tus preguntas – SLaks

Respuesta

5

Es el finalizador de la clase ViewModelBase. Es llamado por el recolector de basura antes de la recolección.

En realidad no es muy útil porque:

a) La recolección de basura funciona muy bien y que no es necesario para probarlo.

b) No le dice nada acerca de su código cuando esto se llama durante la ejecución normal, porque en su mayor parte, el recolector de basura hace lo suyo y recopila cuando determina que hay presión de memoria.

En su mayor parte, está bien que no se preocupe por el recolector de basura; solo preocúpese cuando tenga un problema real.

También la experiencia me dice: evite usar el finalizador ya que nunca está seguro de qué estado será el resto de su programa cuando se llame.

7

Esto se llama finalizer.

Es invocado por el recolector de basura en un momento indeterminado en el momento en que se recoge el objeto, en el hilo del GC.

También tienen un impacto en el rendimiento.

En general, usted nunca escribe un finalizador.
Los finalizadores son utilizados por las clases que poseen directamente recursos nativos (a menos que utilicen SafeHandles, lo que deberían hacer), y por trucos especiales de depuración.

2

Es un finalizador (un método especial invocado por el recolector de basura). Los finalizadores están diseñados para disponer recursos no gestionados propiedad de un tipo que implementa IDisposable, incluso si su método Dispose() nunca se llama.

La razón por la cual el autor de esta clase escribió que el código de depuración no es 100% claro, pero tal código de depuración es generalmente solo un medio de decir "oye, has olvidado llamar al Dispose() manualmente". Es una ayuda de depuración bastante común (lo he visto en un montón de código), aunque yo no lo uso.

A veces, una instancia de un tipo contiene recursos valiosos y le conviene llamar a Dispose() tan pronto como haya terminado. Lo que está haciendo el código del autor es decir "si alguna vez llego a este Finalizador, estás fallando en llamar a Dispose() lo antes posible". Sin embargo, no es en realidad de lo que utilizarías un Finalizer en el código de producción.

+0

Parece que lo está usando para un seguimiento de por vida. – SLaks

+0

Creo que tienes razón. Si el tipo no es IDisposable y no contiene un recurso precioso, entonces parece un código de depuración bastante inútil. Prácticamente cada vez que he visto gente añadiendo finalizadores #de DEBUG es para asegurar que el Finalizer nunca se ejecute (debe ser suprimido cuando se elimina manualmente para evitar el golpe de perfusión). Sé que sabes esto, solo deletrearlo para la gente interesada :) –

Cuestiones relacionadas