반환 유형이없는 기능 위임


561

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

답변:


759

모든 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에 정의 됨)에 새로 추가되었습니다.


11
참고로, 기본 클래스 라이브러리의 다음 버전은 4 개 이상의 공식 매개 변수를 지원하는 Func 및 Action 유형을 포함합니다. 그들이 얼마나 큰지 정확히 기억하지 못합니다.
Eric Lippert

88
.NET 4.0에서는 이제 최대 8 개의 매개 변수로 이동합니다. 그들이 이것을 유지한다면 다음 버전에서는 11까지 올라갈 것입니다 !! 11 !!!
Michiel van Oosterhout

9
실제로 4.0에서 16까지 올라간 것처럼 보입니다.
Tustin2121

7
1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, ... 이것은 컴파일러가 현재 어느 시점에서 보다 더 많은 인수에 대해 함수 에 대처할 수 있어야 함을 분명히 나타냅니다. !
Chris Morgan

6
실제로 Tustin2121은 Func<,,, ... ,>.NET 4.0에서 최대 16 개의 매개 변수 (및 경우에는 반환 유형)까지 올라갔지 만 각 "시리즈"의 마지막 8 가지 유형은에서 System.Core.dll가 아니라에 정의되어 mscorlib.dll있습니다. 왜 michielvoo는 그들을 보지 못했습니다. 그러나 .NET 버전 4.5 및 4.5.1에는 더 이상 기능 또는 동작이 추가되지 않았습니다. 이 순서가 A170836 또는 A170875가 됩니까? 계속 지켜봐 주시기 바랍니다.
Jeppe Stig Nielsen

83

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

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


47

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

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

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


27

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


1
그래도 0 arg는 생각하지 않으며 .Net 2.0에는 존재하지 않습니다.
Brian

1
이상한 점 : Func는 .Net 2.0에 전혀 존재하지 않지만 Predicate와 Action은 그렇지 않습니다.
Joel Coehoorn 님

2
.NET 2.0의 경우 MethodInvoker 델리게이트를 사용하십시오.
Trevor Elliott

.NET 2는 Converter<TInput, TOutput>나중에와 비슷한 델리게이트 유형을 가지고 Func<T, TResult>있습니다. 그것은 List<>.ConvertAll모든 List<>객체를 다른 객체 에 투영하고 모든 "함수 값"을 new에 배치 하는 방법 에 사용되었습니다 List<>. (나중에, 하나는 종종 Linq에를 사용하는 것이 Select그것을 위해.)
Jeppe의 Stig 닐슨

0

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

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


0

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

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

public delegate void MethodInvoker()

0

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

1
이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명은 크게 장기 가치를 향상 할 보여줌으로써 이 문제에 대한 좋은 해결책이고, 다른 유사한 질문을 미래의 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
iBug
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.