Делегат Func без возвращаемого типа


все делегаты Func возвращают значение. Каковы делегаты .NET, которые могут использоваться с методами, возвращающими void?

7   464   2009-05-27 23:21:42

7 ответов:

все делегаты 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 (определяется в системе.Сердечник.)

... не принимает аргументов и имеет тип возврата void?

Я считаю Action Это решение этой проблемы.

все делегаты Func принимают по крайней мере один параметр

это неправда. Все они принимают по крайней мере один аргумент типа, но этот аргумент определяет тип возвращаемого значения.

так Func<T> не принимает параметров и возвращает значение. Используйте Action или Action<T> когда вы не хотите возвращать значение.

попробовать System.Func<T> и System.Action

иногда вы хотите написать делегат для обработки событий, в этом случае вы можете воспользоваться System.EvenHandler<T> который неявно принимает аргумент типа object в дополнение ко второму параметру, который должен быть производным от EventArgs. Обработчики событий вернутся void

Я лично нашел это полезным во время тестирования для создания одноразового обратного вызова в теле функции.

... не принимает аргументов и имеет тип возврата void?

Если вы пишете для System.Windows.Forms, вы также можете использовать:

public delegate void MethodInvoker()

очень простой способ вызова подпрограмм return и non return value. использует Func и действие соответственно. (см. также 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());
    }  
}