635

이 질문에는 이미 답변이 있습니다.

실제 예제와 그 사용법을 통해 누군가 나를 이해할 수있게 도와 줄 수 있습니까?

  1. Func 대리인은 언제 필요합니까?
  2. 우리는 언제 Action Delegate가 필요합니까?
  3. 프레디 케이트 대리인은 언제 필요합니까?


  • 이것은 중복이지만 더 철저하게 수용된 대답을 가지고 있습니다. - reggaeguitar
  • @reggaeguitar 흥미로운 점은 받아 들여지는 대답이 Jon Skeet - rafid059

3 답변


810

차이점FuncAction위임자가 값을 반환하도록할지 여부는 간단합니다 (useFunc) 또는 사용하지 않음 (useAction).

FuncLINQ에서 가장 일반적으로 사용됩니다 - 예를 들면 :

 list.Select(x => x.SomeProperty)

또는 필터링 :

 list.Where(x => x.SomeValue == someOtherValue)

또는 키 선택 :

 list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)

Action더 일반적으로 같은 것들에 사용됩니다List<T>.ForEach: 목록의 각 항목에 대해 지정된 작업을 실행합니다. 나는 이것을보다 자주 사용하지 않는다.Func, 비록 내가해야 할 것때로는 매개 변수없는 버전을 사용하여Control.BeginInvokeDispatcher.BeginInvoke.

Predicate특수 케이스에 불과하다.Func<T, bool>정말로, 모든Func대부분의Action대의원들이 따라왔다. 우리가 이미 가지고 있었다면FuncAction그들의 다양한 모습으로,Predicate소개 된 적은 없을거야.~하다대의원의 사용에 일정한 의미를 부여하는 반면,FuncAction널리 다른 용도로 사용됩니다.

Predicate에서 주로 사용됩니다.List<T>같은 방법FindAllRemoveAll.


  • 나는 보는 것을 좋아한다.Predicate함수 서명에서. 전달 된 메서드는 성공 코드 또는 다른 종류의bool. - Ron Warholic
  • 선호 여부에 대한 디자인 가이드 라인이 있습니까?Predicate<T>또는Func<T,bool>? 나는 표현의 좋아함을 좋아한다.Predicate하지만 권장 사항은Func너무. - CodesInChaos
  • @ 론 : 그렇습니다. 두 번째 마지막 단락에 관한 것입니다. - Jon Skeet
  • @ CodeInChaos : 내가 본 것만은 아닙니다. LINQ 사용Func처음부터 끝까지 여러 가지 방법을 사용할 수 있다면 일관성을 유지하는 것이 좋습니다.Func<T,bool>또한 술어가Func<T,int,bool>색인 된 술어의 경우. - Jon Skeet
  • 나는 당신이 그것을 설명했다는 것과 같은 친절한 ' 같다. func - 액션을 반환합니다 - perform (method) - Juvil

322

동작메서드에 대한 델리게이트 (포인터)이며 0, 하나 이상의 입력 매개 변수를 취하지 만 아무 것도 반환하지 않습니다.

기능메서드에 대한 델리게이트 (포인터)이며, 0, 하나 이상의 입력 매개 변수를 취하고 값 (또는 참조)을 반환합니다.

술부는 종종 비교를 위해 사용되는 특수한 종류의 Func입니다.

Linq와 함께 널리 사용 되긴하지만, Action과 Func은 Linq와 논리적으로 독립적 인 개념입니다. C ++에는 이미 형식화 된 함수 포인터의 형태로 기본 개념이 포함되어 있습니다.

다음은 Linq를 사용하지 않고 Action과 Func의 작은 예제입니다.

class Program
{
    static void Main(string[] args)
    {
        Action<int> myAction = new Action<int>(DoSomething);
        myAction(123);           // Prints out "123"
                                 // can be also called as myAction.Invoke(123);

        Func<int, double> myFunc = new Func<int, double>(CalculateSomething);
        Console.WriteLine(myFunc(5));   // Prints out "2.5"
    }

    static void DoSomething(int i)
    {
        Console.WriteLine(i);
    }

    static double CalculateSomething(int i)
    {
        return (double)i/2;
    }
}


  • Predicate는 일반 매개 변수를 사용하고 bool을 반환하는 대리자입니다. - Martin
  • 좋은 예! myAction을 호출하기 만하면 myAction을 호출 할 수도 있습니다.myAction(123);. 사용하지 않아도됩니다..Invoke() - romar
  • 그리고 매개 변수를 취하지 않고 값 (또는 참조)을 반환하는 Func을 사용하려면 완전성을 위해 다음과 같이 작성해야합니다Func < double > myFoo = new Func < double > (foo);그리고 foo 정의는정적 double foo () {return 1.0;} - A.B.

58

기능- 매개 변수를 취할 수도 있고 취하지 않을 수도있는 함수에 대한 대리자를 원할 때 값을 반환합니다. 가장 일반적인 예로 LINQ에서 선택 :

var result = someCollection.Select( x => new { x.Name, x.Address });

동작- 매개 변수를 사용할 수도 있고 사용하지 않을 수도 있고 값을 반환하지 않는 함수에 대한 대리자가 필요할 때 익명 이벤트 처리기에 다음을 자주 사용합니다.

button1.Click += (sender, e) => { /* Do Some Work */ }

술부- 기준 세트에 대해 값을 평가하고 부울 결과를 반환하는 Func의 특수 버전을 원할 때 (일치하는 경우 true, 그렇지 않은 경우 false).다시 말하지만 LINQ에서는 다음과 같은 경우에 자주 사용됩니다. Where :

var filteredResults = 
    someCollection.Where(x => x.someCriteriaHolder == someCriteria);

난 그냥 두 번 확인하고 LINQ는 술어를 사용하지 않는 것으로 밝혀졌습니다. 그들이 왜 그 결정을 내렸는 지 확신 할 수는 없지만 이론적으로 그것은 술어가 적합 할 수있는 상황입니다.


  • 나는 이것이 오래되었다는 것을 알고 있습니다. 그러나 Predicate는 LINQ에 의해 사용되지 않았습니다. 왜냐하면 그것은 우리가 오늘날 알고있는 Func과 Action보다 먼저 나오기 때문입니다. 그리고 후자의 두 가지를 사용하면 훨씬 더 똑같은 결과를 얻을 수 있습니다. - gparent
  • @gparent, 왜 더 나은가요? 의미있는 이름의 대리자를 사용할 때가독성이 더 좋습니다.Func또는Action. - Sam
  • 델리게이트를 사용하는 방법에 따라 다르지만, 이름이 중요하지 않은 경우가 종종 있으며, 사용하기 쉽도록 함수 및 변수를 만들어야하는 경우 가독성이 떨어집니다. - gparent

연결된 질문


관련된 질문

최근 질문