대의원 : 술어 대 행동 대 Func


137

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

  • 술부
  • 동작
  • 펑크

답변:


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

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

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

다른 중요한 대의원 :

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

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


3
도 있습니다 System.Converter<TInput, TOutput>이 거의 사용되지 비록.
G-Wiz

4
변환기는 모델을 비즈니스 클래스로 변환하는 데 필요한 많은 경우, 즉 stum.de/2009/12/23/…
Michael Stum

EventHandler/EventHandler<T>WinForms 외부에도 나타납니다.
Andy

@Andy : 다소 ... 그러나 WPF에서는 덜 그렇습니다. WinForms 고유의 것이 없다는 것에 동의합니다.
Jon Skeet

48

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

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

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

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


BEST와 간단한 대답이 질문에 관하여 이제까지 발견
Reyan Chougle에게

@ReyanChougle : 다행입니다. 도움이됩니다.
Rahul Garg

9

Jon의 답변 외에도

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

4

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

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

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


3

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

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

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

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


2

람다가있는 액션 및 기능 :

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();

2

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

2

인수와 각 유형을 바꾸는 것에 대한 간단한 예

이 Func은 두 개의 int 인자를 받아서 int를 반환합니다.

 Func<int, int, int> sum = (a, b) => a + b;
 Console.WriteLine(sum(3, 5));//Print 8

이 경우 func에는 인수가 없지만 문자열을 반환합니다.

Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world

이 조치는 두 개의 int 인수를 사용하여 void를 리턴합니다.

Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6

이 술어는 하나의 인수를 취하고 항상 bool을 리턴합니다. 일반적으로 술어는 항상 bool을 리턴합니다.

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.