이 질문에는 이미 답변이 있습니다.
실제 예제와 그 사용법을 통해 누군가 나를 이해할 수있게 도와 줄 수 있습니까?
차이점Func
과Action
위임자가 값을 반환하도록할지 여부는 간단합니다 (useFunc
) 또는 사용하지 않음 (useAction
).
Func
LINQ에서 가장 일반적으로 사용됩니다 - 예를 들면 :
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.BeginInvoke
과Dispatcher.BeginInvoke
.
Predicate
특수 케이스에 불과하다.Func<T, bool>
정말로, 모든Func
대부분의Action
대의원들이 따라왔다. 우리가 이미 가지고 있었다면Func
과Action
그들의 다양한 모습으로,Predicate
소개 된 적은 없을거야.~하다대의원의 사용에 일정한 의미를 부여하는 반면,Func
과Action
널리 다른 용도로 사용됩니다.
Predicate
에서 주로 사용됩니다.List<T>
같은 방법FindAll
과RemoveAll
.
Predicate
함수 서명에서. 전달 된 메서드는 성공 코드 또는 다른 종류의bool
. - Ron WarholicPredicate<T>
또는Func<T,bool>
? 나는 표현의 좋아함을 좋아한다.Predicate
하지만 권장 사항은Func
너무. - CodesInChaosFunc
처음부터 끝까지 여러 가지 방법을 사용할 수 있다면 일관성을 유지하는 것이 좋습니다.Func<T,bool>
또한 술어가Func<T,int,bool>
색인 된 술어의 경우. - Jon Skeet
동작메서드에 대한 델리게이트 (포인터)이며 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;
}
}
myAction(123);
. 사용하지 않아도됩니다..Invoke()
- romar
기능- 매개 변수를 취할 수도 있고 취하지 않을 수도있는 함수에 대한 대리자를 원할 때 값을 반환합니다. 가장 일반적인 예로 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);
strike>
난 그냥 두 번 확인하고 LINQ는 술어를 사용하지 않는 것으로 밝혀졌습니다. 그들이 왜 그 결정을 내렸는 지 확신 할 수는 없지만 이론적으로 그것은 술어가 적합 할 수있는 상황입니다.
Func
또는Action
. - Sam