Gibt es Funktionszeiger in c #?

7

Ich versuche etwas c # -Coding zu lernen und frage mich, ob das c ++ - Konzept von Funktionszeigern in c # enthalten ist. Ich sehe, es gibt Dinge wie Delegierte. Sind sie das gleiche Konzept? oder unterscheiden sie sich auf einer grundlegenderen Ebene?

    
yamspog 29.04.2010, 16:04
quelle

4 Antworten

15

Delegierte sind im Wesentlichen Funktionszeiger, aber mit zusätzlichen integrierten Multicast-Funktionen. Sie können also demselben Delegaten mehrere Funktionen zuweisen, und sie werden alle nacheinander aufgerufen, wenn der Delegat aufgerufen wird.

Delegierte verfügen außerdem über integrierte asynchrone Schnittstellen und haben bei der Zuweisung neuer Funktionen zu einem Delegaten (und in .NET 4, wenn sie Delegaten umhergeben)

    
thecoop 29.04.2010, 16:06
quelle
16

Wie andere bereits gesagt haben, möchten Sie Delegaten für Situationen in C # verwenden, für die Sie Funktionszeiger in C ++ verwendet hätten. Delegierte sind konzeptionell ähnlich wie Funktionszeiger, aber viel angenehmer zu verwenden, da sie nicht nur die Funktion, sondern auch das "empfangende" Objekt einkapseln, welches das "Dies" des Aufrufs sein wird.

Beachten Sie, dass die CLR das Konzept von Funktionszeigern hat. Wenn Sie sich genau ansehen, wie der C # -Compiler Code generiert, der Delegaten erstellt, sehen Sie, dass er einen verwalteten Verweis auf eine Funktion erstellt und diesen an einen Delegate-Konstruktor übergibt. In C # gibt es keine Sprachfunktion, mit der Sie den Funktionszeiger "naked" aufrufen und direkt manipulieren können.

Da das Konzept jedoch in der CLR existiert, ist es theoretisch möglich, dass eine zukünftige Version von C # Funktionszeiger als ein erstklassiges Konzept in unsicheren Code unterstützen könnte, genauso wie wir Datenzeiger in unsicherem Code unterstützen. Was wir in diesem Fall tun würden, ist (1) die Signatur des Funktionszeigers als Zeigertyp zu verfolgen und (2) Code zu emittieren, der den CIL-Opcode "Calli" (Aufruf über Zeiger-Indirektion) verwendet.

Dies würde die Effizienz in bestimmten obskuren Interop-Szenarien erhöhen, in denen Sie heute den Marshalling-Code durch viele Ringe springen lassen müssen, indem Sie Delegierten-Instanzen nur so aufbauen, dass der Marshaller den in ihnen gespeicherten Funktionszeiger erreichen kann. Wenn wir es vermeiden könnten, die Kosten für die Konstruktion der Delegierten aufzuwenden und direkt zum Funktionszeiger zu gehen, könnten diese jetzt seltenen Interop-Szenarien weniger teuer werden.

Allerdings würde ich nicht auf diese Funktion warten, wenn ich Sie wäre. Wir haben es als Prototyp entwickelt und es funktioniert einigermaßen gut, aber ich denke nicht, dass die Nachfrage es erfordert, es zu einer allgemeinen Sprache wie C # zu dieser Zeit hinzuzufügen.

    
Eric Lippert 29.04.2010 17:10
quelle
4

Nicht im klassischen C / C ++ Sinn, nein. Aber das Konzept ist ähnlich - .NET führt das Konzept von Delegierten ein, um mit Situationen fertig zu werden, die Sie benötigen eine Variable, auf die eine Methode angewendet werden kann. Delegierte können nicht mit "Zappeln" wie Zeiger können und es gibt Typ Sicherheit eingebaut.

Wenn Sie C-Style-Funktionszeiger "richtig" verwenden, sind die Konzepte ähnlich. Aber es scheint eine Menge Legacy-Code zu geben, der lustige Manipulationen an den Zeigern macht, um Typ-Sicherheit oder was-nicht-umgehen.

    
Jesse C. Slicer 29.04.2010 16:08
quelle
2

Ein Delegat ähnelt in mancher Hinsicht einem Funktionszeiger, aber er liegt näher an einer Schnittstelle mit nur einer Funktion, kombiniert mit einer Möglichkeit, Handler und einen Multicast-Dispatching-Mechanismus zu registrieren.

Es ist also viel mehr als ein Funktionszeiger.

    
Mark Byers 29.04.2010 16:06
quelle

Tags und Links