You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| repräsentiert eine Methodensignatur | wenn eine Klasse eine Schnittstelle implementiert, dann implementiert sie deren gesamte Methoden |
363
412
| lässt sich nur auf Methoden anwenden | deckt sowohl Methoden als auch Eigenschaften ab |
364
-
| verwendbar, wenn ein Delegat im Scope verfügbar ist | kann nur verwendet werden, wenn die Klasse diese Schnittstelle implementiert |
365
-
| wird für die Behandlung von Ereignissen verwendet | findet keine Anwendung bei der Behandlung von Ereignissen. |
413
+
| wird für die Behandlung von Ereignissen verwendet ||
366
414
| kann auf anonyme Methoden zugreifen | kann nicht auf anonyme Methoden zugreifen. |
367
415
| beim Zugriff auf eine Methode über Delegaten ist kein Zugriff auf das Objekt der Klasse erforderlich | beim Methodenzugriff benötigen Sie das Objekt der Klasse, die eine Schnittstelle implementiert |
368
416
| unterstützt keine Vererbung | unterstützt Vererbung |
@@ -505,7 +553,7 @@ Das Erstellen anonymer Methoden verkürzt den Code, da nunmehr ein Codeblock als
505
553
506
554
```csharp
507
555
// Declare a delegate pointing at an anonymous function.
508
-
Deld=delegate(intk) { /* ... */ };
556
+
DelgatenTyped=delegate(intk) { /* ... */ };
509
557
510
558
```
511
559
Das folgende Codebeispiel illustriert die Verwendung. Dabei wird auch deutlich, wie
Jeder Lambdaausdruck kann in einen Delegat-Typ konvertiert werden. Der Delegattyp, in den ein Lambdaausdruck konvertiert werden kann, wird durch die Typen seiner Parameter und Rückgabewerte definiert.
625
+
Jeder Lambdaausdruck kann in einen Delegat-Typ konvertiert werden. Der Delegat-Typ, in den ein Lambdaausdruck konvertiert werden kann, wird durch die Typen seiner Parameter und Rückgabewerte definiert.
Warum würde die Verwendung von Action an dieser Stelle einen Fehler generieren?
730
778
779
+
## Abgrenzung zu c++
780
+
781
+
> Gibt es in C++ Delegaten?
782
+
783
+
In C++ gibt es kein direktes Äquivalent zu C#-Delegaten. Stattdessen werden in C++ Funktionszeiger oder Funktionsobjekte (auch bekannt als Funktoren) verwendet, um ähnliche Funktionalitäten zu erreichen.
784
+
785
+
```c++ CppDelegates.cpp
786
+
#include<iostream>
787
+
#include<functional>// std::function, std::bind
788
+
usingnamespacestd;
789
+
790
+
// Normale Funktion
791
+
voidPrintHello(string text)
792
+
{
793
+
cout << text << endl;
794
+
}
795
+
796
+
// Normale Funktion
797
+
void Square(int x)
798
+
{
799
+
cout << "This is method Square(int x)" << endl;
800
+
cout << x * x << endl;
801
+
}
802
+
803
+
// Funktion mit Rückgabewert
804
+
int SquareReturn(int x)
805
+
{
806
+
return x * x;
807
+
}
808
+
809
+
int main()
810
+
{
811
+
// --- Funktionszeiger ---
812
+
void (*myOutput)(string) = PrintHello;
813
+
myOutput("Das ist eine Textausgabe");
814
+
815
+
// --- Funktionsobjekt (Lambda) ---
816
+
auto myLambdaAction = [](string text) {
817
+
cout << text << " modifiziert durch Lambda" << endl;
818
+
};
819
+
myLambdaAction("Tests");
820
+
821
+
// --- Funktionsobjekt (Lambda mit Rückgabewert) ---
822
+
auto myFuncOutput = [](int x) {
823
+
return x * x;
824
+
};
825
+
cout << myFuncOutput(5) << endl;
826
+
827
+
// --- std::function mit freier Funktion ---
828
+
std::function<void(string)> f1 = PrintHello;
829
+
f1("Ausgabe über std::function mit freier Funktion");
830
+
831
+
// --- std::function mit Lambda ---
832
+
std::function<void(string)> f2 = [](string t) {
833
+
cout << "Lambda via std::function: " << t << endl;
834
+
};
835
+
f2("Test");
836
+
837
+
// --- std::function mit std::bind (z. B. um Argumente zu binden) ---
838
+
std::function<void()> f3 = std::bind(Square, 7);
839
+
f3(); // Gibt 49 aus
840
+
841
+
// --- std::function mit Rückgabewert ---
842
+
std::function<int(int)> f4 = SquareReturn;
843
+
cout << "Quadrat über std::function<int(int)>: " << f4(6) << endl;
0 commit comments