Alle Func-Delegaten geben einen Wert zurück. Welche .NET-Delegaten können mit Methoden verwendet werden, die void zurückgeben?
Alle Func-Delegaten geben einen Wert zurück. Welche .NET-Delegaten können mit Methoden verwendet werden, die void zurückgeben?
Antworten:
Alle Func-Delegierten geben etwas zurück. Alle Aktionsdelegierten kehren ungültig zurück.
Func<TResult>
nimmt keine Argumente und gibt TResult zurück:
public delegate TResult Func<TResult>()
Action<T>
nimmt ein Argument und gibt keinen Wert zurück:
public delegate void Action<T>(T obj)
Action
ist der einfachste, "nackte" Delegierte:
public delegate void Action()
Es gibt auch Func<TArg1, TResult>
und Action<TArg1, TArg2>
(und andere bis zu 16 Argumente). Alle diese (außer Action<T>
) sind neu in .NET 3.5 (definiert in System.Core).
Func<,,, ... ,>
in .NET 4.0 bis zu 16 Parameter (plus einen Rückgabetyp im Fall von ) erreicht, aber die letzten acht Typen jeder "Serie" sind in definiert System.Core.dll
, nicht in mscorlib.dll
, also wäre dies der Grund warum michielvoo sie nicht gesehen hat. In den .NET-Versionen 4.5 und 4.5.1 wurden jedoch keine Funktionen oder Aktionen mehr hinzugefügt. Wird diese Sequenz zu A170836 oder A170875 ? Bleib dran.
... keine Argumente akzeptiert und einen ungültigen Rückgabetyp hat?
Ich glaube, das Action
ist eine Lösung.
Alle Func-Delegierten verwenden mindestens einen Parameter
Das ist nicht wahr. Sie alle verwenden mindestens ein Typargument, aber dieses Argument bestimmt den Rückgabetyp.
So Func<T>
übernimmt keine Parameter und gibt einen Wert. Verwenden Sie Action
oder, Action<T>
wenn Sie keinen Wert zurückgeben möchten.
Versuchen Sie System.Func<T>
undSystem.Action
Converter<TInput, TOutput>
der dem späteren ähnelte Func<T, TResult>
. Es wurde in der List<>.ConvertAll
Methode verwendet, die jedes Element in einem List<>
auf ein anderes Objekt projizierte und alle "Funktionswerte" in ein neues platzierte List<>
. (Später benutzte man oft Linq Select
dafür.)
Gelegentlich möchten Sie einen Delegaten für die Ereignisbehandlung schreiben. In diesem Fall können Sie den Vorteil nutzen, der zusätzlich zu dem zweiten Parameter, von System.EvenHandler<T>
dem abgeleitet werden soll, implizit ein Argument vom Typ akzeptiert . EventHandlers kehren zurückobject
EventArgs
void
Ich persönlich fand dies beim Testen nützlich, um einen einmaligen Rückruf in einem Funktionskörper zu erstellen.
... keine Argumente akzeptiert und einen ungültigen Rückgabetyp hat?
Wenn Sie für schreiben System.Windows.Forms
, können Sie auch Folgendes verwenden:
public delegate void MethodInvoker()
Eine sehr einfache Möglichkeit, Subroutinen für Rückgabewerte und Nichtrückgabewerte aufzurufen. verwendet Func bzw. Action . (Siehe auch https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
Versuchen Sie dies in diesem Beispiel
using System;
public class Program
{
private Func<string,string> FunctionPTR = null;
private Func<string,string, string> FunctionPTR1 = null;
private Action<object> ProcedurePTR = null;
private string Display(string message)
{
Console.WriteLine(message);
return null;
}
private string Display(string message1,string message2)
{
Console.WriteLine(message1);
Console.WriteLine(message2);
return null;
}
public void ObjectProcess(object param)
{
if (param == null)
{
throw new ArgumentNullException("Parameter is null or missing");
}
else
{
Console.WriteLine("Object is valid");
}
}
public void Main(string[] args)
{
FunctionPTR = Display;
FunctionPTR1= Display;
ProcedurePTR = ObjectProcess;
FunctionPTR("Welcome to function pointer sample.");
FunctionPTR1("Welcome","This is function pointer sample");
ProcedurePTR(new object());
}
}