Func<T1,T2,T3,T4,TResult> 대리자
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
4개의 매개 변수가 있으며 TResult
매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다.
generic <typename T1, typename T2, typename T3, typename T4, typename TResult>
public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
public delegate TResult Func<in T1,in T2,in T3,in T4,out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
public delegate TResult Func<T1,T2,T3,T4,TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
type Func<'T1, 'T2, 'T3, 'T4, 'Result> = delegate of 'T1 * 'T2 * 'T3 * 'T4 -> 'Result
Public Delegate Function Func(Of In T1, In T2, In T3, In T4, Out TResult)(arg1 As T1, arg2 As T2, arg3 As T3, arg4 As T4) As TResult
Public Delegate Function Func(Of T1, T2, T3, T4, TResult)(arg1 As T1, arg2 As T2, arg3 As T3, arg4 As T4) As TResult
형식 매개 변수
- T1
이 대리자로 캡슐화되는 메서드의 첫 번째 매개 변수 형식입니다.
이 형식 매개 변수는 반공변(Contravariant)입니다. 즉, 지정한 형식이나 더 적게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.- T2
이 대리자로 캡슐화되는 메서드의 두 번째 매개 변수 형식입니다.
이 형식 매개 변수는 반공변(Contravariant)입니다. 즉, 지정한 형식이나 더 적게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.- T3
이 대리자로 캡슐화되는 메서드의 세 번째 매개 변수 형식입니다.
이 형식 매개 변수는 반공변(Contravariant)입니다. 즉, 지정한 형식이나 더 적게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.- T4
이 대리자로 캡슐화되는 메서드의 네 번째 매개 변수 형식입니다.
이 형식 매개 변수는 반공변(Contravariant)입니다. 즉, 지정한 형식이나 더 적게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.- TResult
이 대리자로 캡슐화되는 메서드의 반환 값 형식입니다.
이 형식 매개 변수는 공변(Covariant)입니다. 즉, 지정한 형식이나 더 많게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.매개 변수
- arg1
- T1
이 대리자로 캡슐화되는 메서드의 첫 번째 매개 변수입니다.
- arg2
- T2
이 대리자로 캡슐화되는 메서드의 두 번째 매개 변수입니다.
- arg3
- T3
이 대리자로 캡슐화되는 메서드의 세 번째 매개 변수입니다.
- arg4
- T4
이 대리자로 캡슐화되는 메서드의 네 번째 매개 변수입니다.
반환 값
이 대리자로 캡슐화되는 메서드의 반환 값입니다.
예제
다음 예제에는 선언 및 사용 하는 방법을 보여 줍니다.는 Func<T1,T2,TResult> 위임 합니다. 이 예제에서는 선언를 Func<T1,T2,TResult> 변수는 람다 식을 할당 하 고는 String 값 및 Int32 매개 변수 값입니다. 람다 식을 반환 true
경우의 길이 String 매개 변수는 값 같음는 Int32 매개 변수입니다. 이 메서드를 캡슐화 하는 대리자가 이후에 문자열 배열에 대 한 필터 문자열에 대 한 쿼리에 사용 됩니다.
using System;
using System.Collections.Generic;
using System.Linq;
public class Func3Example
{
public static void Main()
{
Func<String, int, bool> predicate = (str, index) => str.Length == index;
String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
IEnumerable<String> aWords = words.Where(predicate).Select(str => str);
foreach (String word in aWords)
Console.WriteLine(word);
}
}
open System
open System.Linq
let predicate = Func<string, int, bool>(fun str index -> str.Length = index)
let words = [ "orange"; "apple"; "Article"; "elephant"; "star"; "and" ]
let aWords = words.Where predicate
for word in aWords do
printfn $"{word}"
Imports System.Collections.Generic
Imports System.Linq
Public Module Func3Example
Public Sub Main()
Dim predicate As Func(Of String, Integer, Boolean) = Function(str, index) str.Length = index
Dim words() As String = { "orange", "apple", "Article", "elephant", "star", "and" }
Dim aWords As IEnumerable(Of String) = words.Where(predicate)
For Each word As String In aWords
Console.WriteLine(word)
Next
End Sub
End Module
설명
사용자 지정 대리자를 명시적으로 선언 하지 않고 매개 변수로 전달할 수 있는 메서드를 나타내는이 대리자를 사용할 수 있습니다. 캡슐화 된 메서드에이 대리자에 의해 정의 되는 메서드 시그니처와 일치 해야 합니다. 이 의미는 캡슐화 된 메서드에 값으로 전달 되는 4 개의 매개 변수는 값을 반환 해야 합니다.
참고
4개의 매개 변수가 있고 반환 void
(F#)(unit
또는 Visual Basic에서는 가 아닌 로 Sub
선언된 )을 Function
참조하려면 제네릭 Action<T1,T2,T3,T4> 대리자를 대신 사용합니다.
사용 하는 경우는 Func<T1,T2,T3,T4,TResult> 대리자 필요가 없습니다를 명시적으로 4 개의 매개 변수를 사용 하 여 메서드를 캡슐화 하는 대리자를 정의 합니다. 예를 들어, 다음 코드는 라는 제네릭 대리자를 명시적으로 선언 Searcher
에 대 한 참조를 할당 합니다 IndexOf 해당 대리자 인스턴스에 메서드.
using System;
delegate int Searcher(string searchString, int start, int count,
StringComparison type);
public class DelegateExample
{
public static void Main()
{
string title = "The House of the Seven Gables";
int position = 0;
Searcher finder = title.IndexOf;
do
{
int characters = title.Length - position;
position = finder("the", position, characters,
StringComparison.InvariantCultureIgnoreCase);
if (position >= 0)
{
position++;
Console.WriteLine("'The' found at position {0} in {1}.",
position, title);
}
} while (position > 0);
}
}
open System
type Searcher = delegate of (string * int * int * StringComparison) -> int
let title = "The House of the Seven Gables"
let finder = Searcher title.IndexOf
let mutable position = 0
while position > -1 do
let characters = title.Length - position
position <-
finder.Invoke("the", position, characters, StringComparison.InvariantCultureIgnoreCase)
if position >= 0 then
position <- position + 1
printfn $"'The' found at position {position} in {title}."
Delegate Function Searcher(searchString As String, _
start As Integer, _
count As Integer, _
type As StringComparison) As Integer
Module DelegateExample
Public Sub Main()
Dim title As String = "The House of the Seven Gables"
Dim position As Integer = 0
Dim finder As Searcher = AddressOf title.IndexOf
Do
Dim characters As Integer = title.Length - position
position = finder("the", position, characters, _
StringComparison.InvariantCultureIgnoreCase)
If position >= 0 Then
position += 1
Console.WriteLine("'The' found at position {0} in {1}.", _
position, title)
End If
Loop While position > 0
End Sub
End Module
다음 예제에서는 인스턴스화하여이 코드를 간소화는 Func<T1,T2,T3,T4,TResult> 명시적으로 새 대리자를 정의 하 고 명명된 된 메서드를 할당 하는 대신 대리자입니다.
using System;
public class DelegateExample
{
public static void Main()
{
string title = "The House of the Seven Gables";
int position = 0;
Func<string, int, int, StringComparison, int> finder = title.IndexOf;
do
{
int characters = title.Length - position;
position = finder("the", position, characters,
StringComparison.InvariantCultureIgnoreCase);
if (position >= 0)
{
position++;
Console.WriteLine("'The' found at position {0} in {1}.",
position, title);
}
} while (position > 0);
}
}
open System
let indexOf (s: string) s2 pos chars comparison =
s.IndexOf(s2, pos, chars, comparison)
let title = "The House of the Seven Gables"
let finder = Func<string, int, int, StringComparison, int>(indexOf title)
let mutable position = 0
while position > -1 do
let characters = title.Length - position
position <-
finder.Invoke("the", position, characters, StringComparison.InvariantCultureIgnoreCase)
if position >= 0 then
position <- position + 1
printfn $"'The' found at position {position} in {title}."
Module DelegateExample
Public Sub Main()
Dim title As String = "The House of the Seven Gables"
Dim position As Integer = 0
Dim finder As Func(Of String, Integer, Integer, StringComparison, Integer) _
= AddressOf title.IndexOf
Do
Dim characters As Integer = title.Length - position
position = finder("the", position, characters, _
StringComparison.InvariantCultureIgnoreCase)
If position >= 0 Then
position += 1
Console.WriteLine("'The' found at position {0} in {1}.", _
position, title)
End If
Loop While position > 0
End Sub
End Module
사용할 수는 Func<T1,T2,T3,T4,TResult> 다음 예제와 같이 C#에서는 무명 메서드로 위임 합니다. (소개 무명 메서드를 참조 하세요 무명 메서드.)
using System;
public class DelegateExample
{
public static void Main()
{
string title = "The House of the Seven Gables";
int position = 0;
Func<string, int, int, StringComparison, int> finder =
delegate(string s, int pos, int chars, StringComparison type)
{ return title.IndexOf(s, pos, chars, type); };
do
{
int characters = title.Length - position;
position = finder("the", position, characters,
StringComparison.InvariantCultureIgnoreCase);
if (position >= 0)
{
position++;
Console.WriteLine("'The' found at position {0} in {1}.",
position, title);
}
} while (position > 0);
}
}
람다 식을 할당할 수도 있습니다는 Func<T1,T2,TResult> 다음 예제와 같이 대리자입니다. 람다 식에 대한 소개는 람다 식(VB), 람다 식(C#) 및 람다 식(F#)을 참조하세요.
using System;
public class DelegateExample
{
public static void Main()
{
string title = "The House of the Seven Gables";
int position = 0;
Func<string, int, int, StringComparison, int> finder =
(s, pos, chars, type) => title.IndexOf(s, pos, chars, type);
do
{
int characters = title.Length - position;
position = finder("the", position, characters,
StringComparison.InvariantCultureIgnoreCase);
if (position >= 0)
{
position++;
Console.WriteLine("'The' found at position {0} in {1}.",
position, title);
}
} while (position > 0);
}
}
open System
let title = "The House of the Seven Gables"
let finder =
Func<string, int, int, StringComparison, int>(fun s pos chars typ -> title.IndexOf(s, pos, chars, typ))
let mutable position = 0
while position > -1 do
let characters = title.Length - position
position <- finder.Invoke("the", position, characters, StringComparison.InvariantCultureIgnoreCase)
if position >= 0 then
position <- position + 1
printfn $"'The' found at position {position} in {title}."
Module DelegateExample
Public Sub Main()
Dim title As String = "The House of the Seven Gables"
Dim position As Integer = 0
Dim finder As Func(Of String, Integer, Integer, StringComparison, Integer) _
= Function(s, pos, chars, type) _
title.IndexOf(s, pos, chars, type)
Do
Dim characters As Integer = title.Length - position
position = finder("the", position, characters, _
StringComparison.InvariantCultureIgnoreCase)
If position >= 0 Then
position += 1
Console.WriteLine("'The' found at position {0} in {1}.", _
position, title)
End If
Loop While position > 0
End Sub
End Module
람다 식의 기본 형식이 제네릭 중 하나인 Func
대리자입니다. 이 대리자를 명시적으로 할당 하지 않고 람다 식을 매개 변수로 전달할 수 있습니다. 특히 때문에 형식의 여러 메서드를 System.Linq 네임 스페이스 Func
매개 변수를 하면 이러한 메서드는 람다 식을 전달할 수 명시적으로 인스턴스화하지 않고도 Func
위임 합니다.
확장 메서드
GetMethodInfo(Delegate) |
지정된 대리자가 나타내는 메서드를 나타내는 개체를 가져옵니다. |
적용 대상
추가 정보
.NET