[C#] 대의원 : 술어 대 행동 대 Func

누군가 다음 세 가지 가장 중요한 대의원에 대한 좋은 설명을 제공 할 수 있습니까?

  • 술부
  • 동작
  • 펑크


답변

  • Predicate본질적으로 Func<T, bool>; “지정된 인수가 대리인이 나타내는 조건을 만족합니까?”라는 질문을합니다. List.FindAll과 같은 것들에서 사용됩니다.

  • Action: 인수가 주어지면 조치를 수행하십시오. 매우 일반적인 목적입니다. 기본적으로 부작용을 의미하므로 LINQ에서는 많이 사용되지 않습니다.

  • Func: LINQ에서 광범위하게 사용 되며 일반적으로 인수를 복잡한 구조를 하나의 속성으로 투영하여 인수를 변환합니다.

다른 중요한 대의원 :

  • EventHandler/ EventHandler<T>: WinForms 전체에서 사용

  • Comparison<T>: IComparer<T>대표적 형태로.


답변

Action, Func그리고 Predicate모든 위임 가족에 속한다.

Action : 조치는 n 개의 입력 매개 변수를 사용할 수 있지만 void를 리턴합니다.

Func: Func는 n 개의 입력 매개 변수를 사용할 수 있지만 항상 제공된 유형의 결과를 반환합니다. Func<T1,T2,T3,TResult>여기서 T1, T2, T3은 입력 매개 변수이고 TResult는 그 출력입니다.

Predicate: 술어도 Func의 한 형태이지만 항상 bool을 리턴합니다. 간단히 말해서 그것은 래퍼입니다 Func<T,bool>.


답변

Jon의 답변 외에도

  • Converter<TInput, TOutput>: 그것은 본질적 Func<TInput, TOutput>으로 의미가 있습니다. List.ConvertAll 및 Array.ConvertAll에서 사용하지만 개인적으로는 다른 곳에서는 보지 못했습니다.

답변

MethodInvoker는 WinForms 개발자가 사용할 수있는 것입니다. 인수를 허용하지 않으며 결과를 반환하지 않습니다. BeginInvoke () 등은 형식화되지 않은 델리게이트를 허용하므로 Action보다 우선하며 UI 스레드를 호출 할 때 여전히 자주 사용됩니다. 비록 행동도 마찬가지입니다.

myForm.BeginInvoke((MethodInvoker)delegate
{
  MessageBox.Show("Hello, world...");
});

또한 ThreadStart 및 ParameterizedThreadStart도 알고 있습니다. 다시 대부분의 사람들은 요즘 행동을 대체 할 것입니다.


답변

조건 자, 기능 및 동작은 .NET의 기본 제공 위임 인스턴스입니다. 이러한 각 델리게이트 인스턴스는 특정 서명이있는 사용자 메소드를 참조하거나 가리킬 수 있습니다.

작업 대리자-작업 대리자 인스턴스는 인수를 사용하고 void를 반환하는 메서드를 가리킬 수 있습니다.

Func 대리자-Func 대리자 인스턴스는 가변 개수의 인수를 사용하고 일부 유형을 반환하는 메서드를 가리킬 수 있습니다.

술어-술어는 func 대리자 인스턴스와 유사하며 가변 개수의 인수를 사용하고 부울 유형을 리턴하는 메소드를 가리킬 수 있습니다.


답변

람다가있는 액션 및 기능 :

person p = new person();
Action<int, int> mydel = p.add;       /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1=  mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();


답변

Func는 LINQ에 더 친숙하며 매개 변수로 전달 될 수 있습니다. (포인트 프리)

술어를 다시 랩핑 할 수 없습니다.

Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;

new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again

new []{2,-4}.Where(IsPositivePred);  //Compile Error
new []{2,-4}.Where(IsPositiveFunc);  //Func as Parameter