Ich habe zwei verschiedene Möglichkeiten gefunden, einen Delegaten mit einer Aktion zu initialisieren:Aktion zum Delegieren: neue Aktion oder Casting-Aktion?
Eine neue Aktion erstellen oder eine Aktion ausführen.
Delegate foo = new Action(() => DoNothing(param));
Delegate bar = (Action)(() => DoNothing(param));
Gibt es einen Unterschied zwischen diesen 2 Syntaxen?
Welcher ist besser und warum?
Edit:
Delegieren ist in diesem Beispiel verwenden, da die Syntax ist nützlich Methoden wie BeginInvoke aufrufen oder mit einem Lambda-Ausdruck Invoke, und es ist wichtig, den Lambda-Ausdruck in eine Aktion
static main
{
Invoke((Action)(() => DoNothing())); // OK
Invoke(new Action(() => DoNothing())); // OK
Invoke(() => DoNothing()); // Doesn't compil
}
private static void Invoke(Delegate del) { }
zu werfen
Aber es ist interessant zu sehen, dass der Compiler diese autorisiert:
Action action =() => DoNothing();
Invoke(action);
Um deine Bearbeitung verwenden: Was für sinnvoll Inhalt würde es in Ihrer 'static'' Invoke' Methode geben? –
Nichts interessantes. Der Zweck der Frage ist nur, um den Unterschied zwischen den 2 Syntaxen zu verstehen. Meine reale Implementierung ist in einer WPF-Anwendung, wenn ich Dispatcher.Invoke() (http://msdn.microsoft.com/en-us/library/cc647509(v=vs.100).aspx) aufrufen – Hyralex
ich sehe. Sie sollten sich immer noch daran erinnern, dass eine 'Aktion' ___is___ ein 'Delegierter' ist, da 'Aktion' von 'Delegierter' abgeleitet ist. Selbst wenn Sie eine Überladung verwenden, die einen Delegierten aufnimmt, können Sie ihm eine Aktion geben. Beispiel: 'Aktionsleiste =() => DoNothing (param); someDispatcher.BeginInvoke (bar); '(siehe [' Dispatcher.BeginInvoke'] (http://msdn.microsoft.com/de-de/library/cc190824.aspx)). Zusatz: In einer neueren Version des Frameworks, .NET 4.5, gibt es eine Überladung von 'Dispatcher.Invoke', die 'Action' übernimmt, aber nur aus Gründen der Bequemlichkeit, siehe http://msdn.microsoft.com/en-us/library /hh199416.aspx. –