C# Language
Func 대리인
수색…
통사론
-
public delegate TResult Func<in T, out TResult>(T arg)
-
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)
-
public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3)
-
public delegate TResult Func<in T1, in T2, in T3, in T4, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
매개 변수
매개 변수 | 세부 |
---|---|
arg 또는 arg1 | 메소드의 (최초의) 파라미터 |
arg2 | 메서드의 두 번째 매개 변수 |
arg3 | 메서드의 세 번째 매개 변수 |
arg4 | 메서드의 네 번째 매개 변수 |
T 또는 T1 | 메소드의 (최초의) 파라미터의 형태 |
T2 | 메소드의 두 번째 매개 변수 유형 |
T3 | 메소드의 세 번째 매개 변수 유형 |
T4 | 메소드의 네 번째 매개 변수 유형 |
TResult | 메소드의 반환 유형 |
매개 변수없이
이 예제에서는 현재 시간을 반환하는 메서드를 캡슐화하는 대리자를 만드는 방법을 보여줍니다.
static DateTime UTCNow()
{
return DateTime.UtcNow;
}
static DateTime LocalNow()
{
return DateTime.Now;
}
static void Main(string[] args)
{
Func<DateTime> method = UTCNow;
// method points to the UTCNow method
// that retuns current UTC time
DateTime utcNow = method();
method = LocalNow;
// now method points to the LocalNow method
// that returns local time
DateTime localNow = method();
}
여러 변수 사용
static int Sum(int a, int b)
{
return a + b;
}
static int Multiplication(int a, int b)
{
return a * b;
}
static void Main(string[] args)
{
Func<int, int, int> method = Sum;
// method points to the Sum method
// that retuns 1 int variable and takes 2 int variables
int sum = method(1, 1);
method = Multiplication;
// now method points to the Multiplication method
int multiplication = method(1, 1);
}
람다 및 익명 메소드
익명 메서드는 대리자가 예상되는 모든 위치에 할당 할 수 있습니다.
Func<int, int> square = delegate (int x) { return x * x; }
람다 식은 같은 것을 표현하는 데 사용할 수 있습니다.
Func<int, int> square = x => x * x;
두 경우 모두 다음과 같이 square
저장된 메서드를 호출 할 수 있습니다.
var sq = square.Invoke(2);
또는 속기로서 :
var sq = square(2);
할당이 유형 안전하도록하려면 익명 메소드의 매개 변수 유형과 리턴 유형이 위임 유형의 매개 변수 유형 및 리턴 유형과 일치해야합니다.
Func<int, int> sum = delegate (int x, int y) { return x + y; } // error
Func<int, int> sum = (x, y) => x + y; // error
공변량 및 반올림 유형 매개 변수
또한 Func
는 공변량 및 반항을 지원합니다.
// Simple hierarchy of classes.
public class Person { }
public class Employee : Person { }
class Program
{
static Employee FindByTitle(String title)
{
// This is a stub for a method that returns
// an employee that has the specified title.
return new Employee();
}
static void Test()
{
// Create an instance of the delegate without using variance.
Func<String, Employee> findEmployee = FindByTitle;
// The delegate expects a method to return Person,
// but you can assign it a method that returns Employee.
Func<String, Person> findPerson = FindByTitle;
// You can also assign a delegate
// that returns a more derived type
// to a delegate that returns a less derived type.
findPerson = findEmployee;
}
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow