Todos os delegados do Func retornam um valor. Quais são os delegados do .NET que podem ser usados com métodos que retornam nulos?
Todos os delegados do Func retornam um valor. Quais são os delegados do .NET que podem ser usados com métodos que retornam nulos?
Respostas:
Todos os delegados da Func retornam algo; todos os delegados da ação retornam nulos.
Func<TResult>
não aceita argumentos e retorna TResult:
public delegate TResult Func<TResult>()
Action<T>
recebe um argumento e não retorna um valor:
public delegate void Action<T>(T obj)
Action
é o delegado mais simples e simples:
public delegate void Action()
Há também Func<TArg1, TResult>
e Action<TArg1, TArg2>
(e outros até 16 argumentos). Todos esses (exceto Action<T>
) são novos no .NET 3.5 (definido em System.Core).
Func<,,, ... ,>
) no .NET 4.0, mas os últimos oito tipos de cada "série" são definidos em System.Core.dll
, não em mscorlib.dll
, portanto, esse seria o motivo porque michielvoo não os viu. No entanto, nenhum Func ou Ação foi adicionado nas versões 4.5 e 4.5.1 do .NET. Essa sequência se tornará A170836 ou A170875 ? Fique ligado.
... não aceita argumentos e tem um tipo de retorno nulo?
Eu acredito que Action
é uma solução para isso.
Todos os delegados do Func usam pelo menos um parâmetro
Isso não é verdade. Todos eles usam pelo menos um argumento de tipo, mas esse argumento determina o tipo de retorno.
Portanto, Func<T>
não aceita parâmetros e retorna um valor. Use Action
ou Action<T>
quando não desejar retornar um valor.
Experimente System.Func<T>
eSystem.Action
Converter<TInput, TOutput>
semelhante ao posterior Func<T, TResult>
. Foi usado no List<>.ConvertAll
método que projetava todos os elementos de um List<>
objeto em outro e colocou todos os "valores de função" em um novo List<>
. (Mais tarde, seria costumam usar Linq Select
para isso.)
Ocasionalmente, você deseja escrever um delegado para manipulação de eventos; nesse caso, você pode tirar vantagem do System.EvenHandler<T>
que aceita implicitamente um argumento do tipo object
, além do segundo parâmetro que deve derivar EventArgs
. EventHandlers retornarávoid
Pessoalmente, achei isso útil durante o teste para criar um retorno de chamada único em um corpo de função.
... não aceita argumentos e tem um tipo de retorno nulo?
Se você está escrevendo System.Windows.Forms
, também pode usar:
public delegate void MethodInvoker()
Uma maneira muito fácil de chamar sub-rotinas de retorno e não retorno. está usando Func e Action, respectivamente. (consulte também https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
Tente este exemplo
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());
}
}