Усі делегати 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());
}
}