114

누군가이 3 명의 가장 중요한 대표자들에 대한 좋은 설명을 해줄 수 있습니까?

  • 술부
  • 동작
  • 기능

C #개발자가 알고 있어야하는 다른 대표는 무엇입니까?

생산 코드에서 얼마나 자주 사용합니까?

8 답변


167

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

  • Action: 인수를 취하여 조치를 수행하십시오. 매우 일반적인 목적. 기본적으로 부작용을 암시하기 때문에 LINQ에는 많이 사용되지 않습니다.

  • Func: 중고품널리LINQ에서 일반적으로 인수를 변환합니다. 하나의 속성에 복잡한 구조를 투영하여

다른 중요한 대표자들 :

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

  • Comparison<T>: 처럼IComparer<T>그러나 대의원 형태로.


  • 또한  System.Converter<TInput, TOutput>, 거의 사용하지는 않지만 - G-Wiz
  • 이 변환기는 모델을 비즈니스 클래스로 변환하는 작업이 많이 필요할 때 좋은 대리자입니다. 즉stum.de/2009/12/23/… - Michael Stum
  • EventHandler/EventHandler<T>WinForms의 외부 전체에 나타납니다. - Andy
  • @ 앤디 : 다소 ... 예를 들어 WPF에서는 그렇다. WinForms와 관련된 것은 없다는 것에 동의합니다. - Jon Skeet

27

Action,FuncPredicate모두 대표단 가족에 속합니다.

Action: 액션은 n 개의 입력 매개 변수를 취할 수 있지만 void를 반환합니다.

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

Predicate: Predicate는 Func의 한 형태이지만 항상 bool을 반환합니다. 간단히 말해서 그것은Func<T,bool>.


9

존의 답변 외에도

  • Converter<TInput, TOutput>: 본질적으로Func<TInput, TOutput>, 그러나 의미론과. List.ConvertAll 및 Array.ConvertAll에 의해 사용되지만 개인적으로 다른 곳에서는 본 적이 없습니다.


4

MethodInvoker는 WinForms 개발자가 사용할 수있는 하나입니다. 인수를받지 않고 결과를 반환하지 않습니다. Action보다 먼저 발생하며 BeginInvoke () 등이 형식이 지정되지 않은 Delegate를 받아들이므로 UI 스레드를 호출 할 때 자주 사용됩니다. 액션이 잘 될 것입니다.

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

나는 또한 ThreadStart와 ParameterizedThreadStart를 알고있을 것이다. 요즘엔 대부분의 사람들이 액션을 대신 할 것입니다.


3

Predicate, Func 및 Action은 .NET의 inbuilt 대리자 인스턴스입니다. 이러한 각 대리자 인스턴스는 특정 서명이있는 사용자 메서드를 참조하거나 가리킬 수 있습니다.

액션 델리게이트 - 액션 델리게이트 인스턴스는 인수를 취하여 void를 반환하는 메소드를 가리킬 수 있습니다.

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

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


3

다른 이들은 이미 특정 대리인의 올바른 사용법을 언급했지만 답변을 완성 할 수있는 내용을 추가하고 싶습니다. Func, Action, Predicate라는 이름은 수학적 배경을 가지고 있습니다. 일을 간단하게하기 위해 다음과 같은 수학 함수의 비공식적 인 정의를 내릴 것입니다 :

함수는 집합 사이의 관계입니다. 우리는 한 세트의 멤버를 받아이를 입력으로 사용하고이 입력을 다른 한 세트의 한 멤버에게만 매핑합니다. 즉, 무언가가 입력되어 출력을 생성합니다.

다시 말하면, 비공식적으로, 수학 술어는 변수에 따라 참이거나 거짓 일 수있는 명령문입니다. 다른 사람들은 boolean을 반환하는 함수를 언급했습니다.

그리고 마지막으로, Action은 void 함수입니다 (또는 더 수학적으로 정확한 이름 - 공허한 방법이나 절차)


2

액션과 펑션 (lambda) :

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


0

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

연결된 질문


관련된 질문

최근 질문