2016-07-21 16 views
3

C# 6.0 in Kürze von Joseph Albahari und Ben Albahari (O'Reilly).Enthält der Objekttyp eine geschützte virtuelle Finalize-Methode?

Copyright 2016 Joseph Albahari und Ben Albahari, 978-1-491-92706-9.

Staaten, auf den Seiten 100-101, dass die Objektklasse Mitglieder sind:

public class Object 
{ 
    public Object(); 
    public extern Type GetType(); 
    public virtual bool Equals (object obj); 
    public static bool Equals (object objA, object objB); 
    public static bool ReferenceEquals (object objA, object objB); 
    public virtual int GetHashCode(); 
    public virtual string ToString(); 
    protected virtual void Finalize(); //<-- this one 
    protected extern object MemberwiseClone(); 
} 

, die mich kontrollieren zu gehen, wenn Sie dazu aufgefordert VS's intellisense mir eine Finalize() Methode für jede Bezugsinstanz gibt, da ich nicht tun Erinnere dich immer daran, einen zu sehen

Es gelingt mir nicht, ein solches Objekt mit einem Finalize Member geerbt (Ich versuche, es innerhalb der Funktion zugreifen, bewusst, dass es geschützt ist).

Ich überprüfte .NET's open source code und die object.cs Datei enthält keine Finalize Methode.

Was fehlt mir? Ist das ein Fehler des Autors?

Antwort

4

Von MSDN:

Der C# Compiler ermöglicht es Ihnen nicht die Finalize-Methode außer Kraft zu setzen. Stattdessen stellen Sie einen Finalizer bereit, indem Sie einen Destruktor für Ihre Klasse implementieren. Ein C# -Destruktor ruft automatisch den Destruktor seiner Basisklasse auf.

Sie müssen ~ClassName() verwenden, um eine destructor zu implementieren.

Object.cs ist in C# geschrieben, so hat es ~Object() anstelle von Finalize().

Ich schlage vor, dass Sie diese article lesen und diese answer

Von Eric Lippert:

Diese Funktion ist verwirrend, fehleranfällig und weithin falsch verstanden. Es hat Syntax sehr vertraut mit Benutzern von C++, aber überraschend Semantik. Und in den meisten Fällen ist die Verwendung der Funktion gefährlich, unnötig oder symptomatisch für einen Fehler.
Manchmal müssen Sie Funktionen implementieren, die nur für Experten sind, die Infrastruktur aufbauen; Diese Funktionen sollten deutlich als als gefährlich gekennzeichnet sein - nicht einladend ähnlich wie in anderen Sprachen.