반환 유형이없는 기능 위임 값을 반환합니다. void를 반환하는

모든 Func 델리게이트는 값을 반환합니다. void를 반환하는 메서드와 함께 사용할 수있는 .NET 대리자는 무엇입니까?



답변

모든 Func 델리게이트는 무언가를 반환합니다. 모든 Action 델리게이트는 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에 정의 됨)에 새로 추가되었습니다.


답변

… 인수를 취하지 않고 void 반환 유형이 있습니까?

나는 Action이것에 대한 해결책 이라고 믿는다 .


답변

모든 Func 델리게이트는 하나 이상의 매개 변수를 사용합니다.

그건 사실이 아니야. 그들은 모두 적어도 하나의 유형 인수를 취하지 만 그 인수는 리턴 유형을 결정합니다.

따라서 Func<T>매개 변수를 허용하지 않고 값을 반환합니다. 값을 반환하지 않으려면 Action또는을 사용하십시오 Action<T>.


답변

시도 System.Func<T>하고System.Action


답변

경우에 따라 이벤트 처리를위한 대리자를 작성하려고 할 수도 있습니다.이 경우 파생되어야하는 두 번째 매개 변수 외에 System.EvenHandler<T>형식 인수를 암시 적으로 사용할 object수 있습니다 EventArgs. EventHandlers가 반환합니다void

필자는 개인적으로 함수 본문에서 일회성 콜백을 만들기 위해 테스트하는 동안 유용한 것으로 나타났습니다.


답변

… 인수를 취하지 않고 void 반환 유형이 있습니까?

에 대해 쓰고 있다면 다음을 System.Windows.Forms사용할 수도 있습니다.

public delegate void MethodInvoker()


답변

리턴 및 비 ​​리턴 값 서브 루틴을 호출하는 매우 쉬운 방법입니다. FuncAction을 각각 사용 하고 있습니다. (참고 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());
    }
}