2012-05-26 2 views
5

Ich versuche, mich mit den Delegierten vertraut zu machen und auf http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx, lese ich gerade:Delegierten in C# und FNC Zeiger in C++

„Im Gegensatz zu Funktionszeiger in C oder C++, die Delegierten sind objektorientiert, Typ- Gesichert und geladen."

ein Mittelwert, ich habe C++ Hintergrund, und etwas kann nicht sehen, wie man das Wort "anders" dort zu verstehen. Was bedeuten sie von Delegaten sind objektorientiert und C++ FNC-Zeiger nicht? Gleiches gilt für den Typ sicher und sicher.

Jeder könnte einige Beispiele und Gegenbeispiele zeigen?

Danke.

+1

Sehen Sie diese Fragen ..... [Typ Unsafe von C++ Funktionszeiger] [1] [Warum C# Funktionszeiger ist besser als C++ Funktionszeiger] [2] [ 1]: http://stackoverflow.com/questions/10237847/how-are-function-pointers-type-unsafe [2]: http://stackoverflow.com/questions/2535516/how-are-delegates- in-c-sharp-besser-als-funktion-pointer-in-cc –

+0

Mögliche Duplikate: [gibt es Funktionszeiger in C#] (http://stackoverflow.com/questions/2738850/are-the re-function-pointer-in-c) –

+0

#MdKamruzzamanPallob vom ersten Link: "Funktionszeiger sind in der Tat typgeprüft und typsicher." – smallB

Antwort

6

Ein Delegat macht viel mehr als ein Funktionszeiger. Es speichert nicht nur die Funktionsadresse, sondern speichert auch eine Referenz auf das Zielobjekt. Im Gegensatz zu einem C++ - Methodenzeiger. So ist es einfach, eine Instanzmethode aufzurufen. Das sorgt für den "objektorientierten" Anspruch.

Ein bißchen down-hill von dort, aber type safety wird vom Compiler sichergestellt, der überprüft, ob die Funktionssignatur genau mit dem Delegattyp übereinstimmt, wenn Sie den Delegaten zuweisen. Was in C++ nicht anders ist, aber es gibt keine Möglichkeit, ein Mismatch wegzuwerfen. Ein weiterer möglicher Sicherheitsaspekt besteht darin, dass der Objektverweis, der von dem Delegatobjekt gehalten wird, für den Garbage Collector sichtbar ist. Sie können also niemals eine Instanzmethode für ein gelöschtes Objekt aufrufen.