누군가이 3 명의 가장 중요한 대표자들에 대한 좋은 설명을 해줄 수 있습니까?
C #개발자가 알고 있어야하는 다른 대표는 무엇입니까?
생산 코드에서 얼마나 자주 사용합니까?
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
: Predicate는 Func의 한 형태이지만 항상 bool을 반환합니다. 간단히 말해서 그것은Func<T,bool>
.
존의 답변 외에도
Converter<TInput, TOutput>
: 본질적으로Func<TInput, TOutput>
, 그러나 의미론과. List.ConvertAll 및 Array.ConvertAll에 의해 사용되지만 개인적으로 다른 곳에서는 본 적이 없습니다.
MethodInvoker는 WinForms 개발자가 사용할 수있는 하나입니다. 인수를받지 않고 결과를 반환하지 않습니다. Action보다 먼저 발생하며 BeginInvoke () 등이 형식이 지정되지 않은 Delegate를 받아들이므로 UI 스레드를 호출 할 때 자주 사용됩니다. 액션이 잘 될 것입니다.
myForm.BeginInvoke((MethodInvoker)delegate
{
MessageBox.Show("Hello, world...");
});
나는 또한 ThreadStart와 ParameterizedThreadStart를 알고있을 것이다. 요즘엔 대부분의 사람들이 액션을 대신 할 것입니다.
Predicate, Func 및 Action은 .NET의 inbuilt 대리자 인스턴스입니다. 이러한 각 대리자 인스턴스는 특정 서명이있는 사용자 메서드를 참조하거나 가리킬 수 있습니다.
액션 델리게이트 - 액션 델리게이트 인스턴스는 인수를 취하여 void를 반환하는 메소드를 가리킬 수 있습니다.
Func 대리자 - Func 대리자 인스턴스는 가변 개수의 인수를 사용하고 일부 형식을 반환하는 메서드를 가리킬 수 있습니다.
술어 - 술어는 func 대리자 인스턴스와 유사하며 가변 개수의 인수를 사용하고 bool 유형을 반환하는 메소드를 가리킬 수 있습니다.
다른 이들은 이미 특정 대리인의 올바른 사용법을 언급했지만 답변을 완성 할 수있는 내용을 추가하고 싶습니다. Func, Action, Predicate라는 이름은 수학적 배경을 가지고 있습니다. 일을 간단하게하기 위해 다음과 같은 수학 함수의 비공식적 인 정의를 내릴 것입니다 :
함수는 집합 사이의 관계입니다. 우리는 한 세트의 멤버를 받아이를 입력으로 사용하고이 입력을 다른 한 세트의 한 멤버에게만 매핑합니다. 즉, 무언가가 입력되어 출력을 생성합니다.
다시 말하면, 비공식적으로, 수학 술어는 변수에 따라 참이거나 거짓 일 수있는 명령문입니다. 다른 사람들은 boolean을 반환하는 함수를 언급했습니다.
그리고 마지막으로, Action은 void 함수입니다 (또는 더 수학적으로 정확한 이름 - 공허한 방법이나 절차)
액션과 펑션 (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();
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
System.Converter<TInput, TOutput>
, 거의 사용하지는 않지만 - G-WizEventHandler/EventHandler<T>
WinForms의 외부 전체에 나타납니다. - Andy