Все делегаты Func возвращают значение. Что такое делегаты .NET, которые можно использовать с методами, возвращающими void?
Все делегаты Func возвращают значение. Что такое делегаты .NET, которые можно использовать с методами, возвращающими void?
Ответы:
Все делегаты Func возвращают что-то; все делегаты Акции возвращают void.
Func<TResult> не принимает аргументов и возвращает TResult:
public delegate TResult Func<TResult>()
Action<T> принимает один аргумент и не возвращает значение:
public delegate void Action<T>(T obj)
Action самый простой «голый» делегат:
public delegate void Action()
Там же Func<TArg1, TResult>и Action<TArg1, TArg2>(и другие до 16 аргументов). Все они (кроме Action<T>) являются новыми для .NET 3.5 (определено в System.Core).
Func<,,, ... ,>) в .NET 4.0, но последние восемь типов каждой «серии» определены в System.Core.dll, а не в mscorlib.dll, так что это будет причиной почему michielvoo не видел их. Однако в версиях 4.5 и 4.5.1 .NET больше не было добавлено ни Funcs, ни Actions. Станет ли эта последовательность A170836 или A170875 ? Следите за обновлениями.
... не принимает аргументов и имеет возвращаемый тип void?
Я считаю, Actionчто это решение.
Все делегаты Func принимают хотя бы один параметр
Это не правда. Все они принимают по крайней мере один аргумент типа, но этот аргумент определяет тип возвращаемого значения.
Так что не Func<T>принимает параметров и возвращает значение. Используйте Actionили Action<T>когда вы не хотите возвращать значение.
Попробуй System.Func<T>иSystem.Action
Converter<TInput, TOutput>который был похож на более поздний Func<T, TResult>. Он использовался в List<>.ConvertAllметоде, который проецировал каждый элемент в a List<>на другой объект и помещал все «значения функции» в новый List<>. (Позже для этого часто использовали бы Linq Select.)
Иногда вам может понадобиться написать делегат для обработки событий, и в этом случае вы можете воспользоваться тем, System.EvenHandler<T>что неявно принимает аргумент типа objectв дополнение ко второму параметру, который должен быть производным EventArgs. EventHandlers вернетсяvoid
Я лично нашел это полезным во время тестирования для создания одноразового обратного вызова в теле функции.
... не принимает аргументов и имеет возвращаемый тип void?
Если вы пишете для System.Windows.Forms, вы также можете использовать:
public delegate void MethodInvoker()
Очень простой способ вызвать функции возврата и возврата. использует Func и Action соответственно. (см. также https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
Попробуйте этот пример
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());
}
}