답변:
모든 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에 정의 됨)에 새로 추가되었습니다.
Func<,,, ... ,>
.NET 4.0에서 최대 16 개의 매개 변수 (및 경우에는 반환 유형)까지 올라갔지 만 각 "시리즈"의 마지막 8 가지 유형은에서 System.Core.dll
가 아니라에 정의되어 mscorlib.dll
있습니다. 왜 michielvoo는 그들을 보지 못했습니다. 그러나 .NET 버전 4.5 및 4.5.1에는 더 이상 기능 또는 동작이 추가되지 않았습니다. 이 순서가 A170836 또는 A170875가 됩니까? 계속 지켜봐 주시기 바랍니다.
시도 System.Func<T>
하고System.Action
Converter<TInput, TOutput>
나중에와 비슷한 델리게이트 유형을 가지고 Func<T, TResult>
있습니다. 그것은 List<>.ConvertAll
모든 List<>
객체를 다른 객체 에 투영하고 모든 "함수 값"을 new에 배치 하는 방법 에 사용되었습니다 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());
}
}