Усі делегати Func повертають значення. Які є .NET-делегати, які можна використовувати з методами, які повертають недійсність?
Усі делегати Func повертають значення. Які є .NET-делегати, які можна використовувати з методами, які повертають недійсність?
Відповіді:
Усі делегати Func щось повертають; всі делегати Дії повертаються недійсними.
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 їх не бачив. Однак більше. Функцій чи дій не додано у .NET версії 4.5 та 4.5.1. Чи стане ця послідовність A170836 або A170875 ? Слідкуйте за налаштуваннями.
... не бере аргументів і має тип недійсного повернення?
Я вважаю Action
, що це рішення для цього.
Усі делегати Func приймають принаймні один параметр
Це не правда. Усі вони приймають принаймні один тип аргументу, але цей аргумент визначає тип повернення.
Таким чином, Func<T>
не приймає жодних параметрів і повертає значення. Використовуйте Action
або Action<T>
коли ви не хочете повертати значення.
Спробуйте System.Func<T>
іSystem.Action
Converter<TInput, TOutput>
який був подібний до більш пізнього Func<T, TResult>
. Він був використаний у List<>.ConvertAll
методі, який проектував кожен елемент List<>
на інший об'єкт і розміщував усі "значення функції" в новому List<>
. (Пізніше часто Select
для цього можна використовувати Linq .)
Іноді ви хочете написати делегата для обробки подій, і в цьому випадку ви можете скористатися тим, System.EvenHandler<T>
що неявно приймає аргумент типу object
на додаток до другого параметра, з якого слід виходити EventArgs
. EventHandlers повернеться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());
}
}