Bagikan melalui


Func<T1,T2,T3,TResult> Delegasikan

Definisi

Merangkum metode yang memiliki tiga parameter dan mengembalikan nilai jenis yang ditentukan oleh TResult parameter .

generic <typename T1, typename T2, typename T3, typename TResult>
public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<in T1,in T2,in T3,out TResult>(T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<T1,T2,T3,TResult>(T1 arg1, T2 arg2, T3 arg3);
type Func<'T1, 'T2, 'T3, 'Result> = delegate of 'T1 * 'T2 * 'T3 -> 'Result
Public Delegate Function Func(Of In T1, In T2, In T3, Out TResult)(arg1 As T1, arg2 As T2, arg3 As T3) As TResult 
Public Delegate Function Func(Of T1, T2, T3, TResult)(arg1 As T1, arg2 As T2, arg3 As T3) As TResult 

Jenis parameter

T1

Jenis parameter pertama metode yang dienkapsulasi delegasi ini.

Parameter jenis ini bersifat kontravarian. Artinya, Anda bisa menggunakan jenis yang Anda tentukan atau jenis apa pun yang tidak banyak diturunkan. Untuk informasi lebih lanjut tentang kovariansi dan kontravariansi, lihat Kovariansi dan Kontravariansi dalam Generik.
T2

Jenis parameter kedua metode yang dienkapsulasi delegasi ini.

Parameter jenis ini bersifat kontravarian. Artinya, Anda bisa menggunakan jenis yang Anda tentukan atau jenis apa pun yang tidak banyak diturunkan. Untuk informasi lebih lanjut tentang kovariansi dan kontravariansi, lihat Kovariansi dan Kontravariansi dalam Generik.
T3

Jenis parameter ketiga dari metode yang dienkapsulasi delegasi ini.

Parameter jenis ini bersifat kontravarian. Artinya, Anda bisa menggunakan jenis yang Anda tentukan atau jenis apa pun yang tidak banyak diturunkan. Untuk informasi lebih lanjut tentang kovariansi dan kontravariansi, lihat Kovariansi dan Kontravariansi dalam Generik.
TResult

Jenis nilai pengembalian metode yang dienkapsulasi delegasi ini.

Parameter jenis ini bersifat kovarian. Artinya, Anda bisa menggunakan jenis yang Anda tentukan atau jenis apa pun yang lebih banyak diturunkan. Untuk informasi lebih lanjut tentang kovariansi dan kontravariansi, lihat Kovariansi dan Kontravariansi dalam Generik.

Parameter

arg1
T1

Parameter pertama metode yang dienkapsulasi delegasi ini.

arg2
T2

Parameter kedua metode yang dienkapsulasi delegasi ini.

arg3
T3

Parameter ketiga dari metode yang dienkapsulasi delegasi ini.

Tampilkan Nilai

TResult

Nilai pengembalian metode yang dienkapsulasi delegasi ini.

Contoh

Contoh berikut menunjukkan cara mendeklarasikan dan menggunakan Func<T1,T2,TResult> delegasi. Contoh ini mendeklarasikan Func<T1,T2,TResult> variabel dan menetapkannya ekspresi lambda yang mengambil String nilai dan Int32 nilai sebagai parameter. Ekspresi lambda mengembalikan true jika panjang String parameter sama dengan nilai Int32 parameter. Delegasi yang merangkum metode ini kemudian digunakan dalam kueri untuk memfilter string dalam array string.

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

Keterangan

Anda dapat menggunakan delegasi ini untuk mewakili metode yang dapat diteruskan sebagai parameter tanpa secara eksplisit menyatakan delegasi kustom. Metode yang dienkapsulasi harus sesuai dengan tanda tangan metode yang ditentukan oleh delegasi ini. Ini berarti bahwa metode yang dienkapsulasi harus memiliki tiga parameter, yang masing-masing diteruskan ke dalamnya berdasarkan nilai, dan harus mengembalikan nilai.

Catatan

Untuk mereferensikan metode yang memiliki tiga parameter dan pengembalian void (unit dalam F#) (atau di Visual Basic, yang dinyatakan sebagai bukan sebagai SubFunction), gunakan delegasi generik Action<T1,T2,T3> sebagai gantinya.

Saat Anda menggunakan Func<T1,T2,T3,TResult> delegasi, Anda tidak perlu secara eksplisit menentukan delegasi yang merangkum metode dengan tiga parameter. Misalnya, kode berikut secara eksplisit mendeklarasikan delegasi generik bernama ParseNumber dan menetapkan referensi ke Parse metode ke instans delegasinya.

using System;
using System.Globalization;

delegate T ParseNumber<T>(string input, NumberStyles styles,
                         IFormatProvider provider);

public class DelegateExample
{
   public static void Main()
   {
      string numericString = "-1,234";
      ParseNumber<int> parser = int.Parse;
      Console.WriteLine(parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture));
   }
}
open System
open System.Globalization

type ParseNumber<'T> = delegate of (string * NumberStyles * IFormatProvider) -> 'T

let numericString = "-1,234"
let parser = ParseNumber<int> Int32.Parse

parser.Invoke(
    numericString,
    NumberStyles.Integer ||| NumberStyles.AllowThousands,
    CultureInfo.InvariantCulture )
|> printfn "%i"
Imports System.Globalization

Delegate Function ParseNumber(Of T)(input As String, styles As NumberStyles, _
                                    provider As IFormatProvider) As T

Module DelegateExample
   Public Sub Main()
      Dim numericString As String = "-1,234"
      Dim parser As ParseNumber(Of Integer) = AddressOf Integer.Parse
      Console.WriteLine(parser(numericString, _
                        NumberStyles.Integer Or NumberStyles.AllowThousands, _
                        CultureInfo.InvariantCulture))
   End Sub
End Module

Contoh berikut menyederhanakan kode ini dengan membuat instans delegasi Func<T1,T2,T3,TResult> alih-alih secara eksplisit mendefinisikan delegasi baru dan menetapkan metode bernama ke dalamnya.

using System;
using System.Globalization;

public class GenericFunc
{
   public static void Main()
   {
      string numericString = "-1,234";
      Func<string, NumberStyles, IFormatProvider, int> parser = int.Parse;
      Console.WriteLine(parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture));
   }
}
open System
open System.Globalization

let parseInt (str: string) styles format = Int32.Parse(str, styles, format)

let numericString = "-1,234"

let parser =
    Func<string, NumberStyles, IFormatProvider, int> parseInt

parser.Invoke(
    numericString,
    NumberStyles.Integer ||| NumberStyles.AllowThousands,
    CultureInfo.InvariantCulture )
|> printfn "%i"
Imports System.Globalization

Module GenericFunc
   Public Sub Main()
      Dim numericString As String = "-1,234"
      Dim parser As Func(Of String, NumberStyles, IFormatProvider, Integer) _
                         = AddressOf Integer.Parse
      Console.WriteLine(parser(numericString, _
                        NumberStyles.Integer Or NumberStyles.AllowThousands, _
                        CultureInfo.InvariantCulture))
   End Sub
End Module

Anda dapat menggunakan Func<T1,T2,T3,TResult> delegasi dengan metode anonim di C#, seperti yang diilustrasikan contoh berikut. (Untuk pengenalan metode anonim, lihat Metode Anonim.)

using System;
using System.Globalization;

public class Anonymous
{
   public static void Main()
   {
      string numericString = "-1,234";
      Func<string, NumberStyles, IFormatProvider, int> parser =
           delegate(string s, NumberStyles sty, IFormatProvider p)
           { return int.Parse(s, sty, p); };
      Console.WriteLine(parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture));
   }
}

Anda juga dapat menetapkan ekspresi lambda ke Func<T1,T2,T3,TResult> delegasi, seperti yang diilustrasikan contoh berikut. (Untuk pengenalan ekspresi lambda, lihat Ekspresi Lambda (VB), Ekspresi Lambda (C#) dan Ekspresi Lambda (F#).)

using System;
using System.Globalization;

public class LambdaExpression
{
   public static void Main()
   {
      string numericString = "-1,234";
      Func<string, NumberStyles, IFormatProvider, int> parser = (s, sty, p)
                   => int.Parse(s, sty, p);
      Console.WriteLine(parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture));
   }
}
open System
open System.Globalization

let numericString = "-1,234"
let parser = Func<string, NumberStyles, IFormatProvider, int>(fun s sty p ->
     Int32.Parse(s, sty, p))
     
parser.Invoke(numericString,
              NumberStyles.Integer ||| NumberStyles.AllowThousands,
              CultureInfo.InvariantCulture)
|> printfn "%i"
Imports System.Globalization

Module LambdaExpression
   Public Sub Main()
      Dim numericString As String = "-1,234"
      Dim parser As Func(Of String, NumberStyles, IFormatProvider, Integer) _
                         = Function(s, sty, p) Integer.Parse(s, sty, p)
      Console.WriteLine(parser(numericString, _
                        NumberStyles.Integer Or NumberStyles.AllowThousands, _
                        CultureInfo.InvariantCulture))
   End Sub
End Module

Jenis ekspresi lambda yang mendasar adalah salah satu delegasi generik Func . Ini memungkinkan untuk meneruskan ekspresi lambda sebagai parameter tanpa secara eksplisit menetapkannya ke delegasi. Secara khusus, karena banyak metode jenis di System.Linq namespace memiliki Func parameter, Anda dapat meneruskan metode ini ekspresi lambda tanpa secara eksplisit membuat Func instans delegasi.

Metode Ekstensi

GetMethodInfo(Delegate)

Mendapatkan objek yang mewakili metode yang diwakili oleh delegasi yang ditentukan.

Berlaku untuk

Lihat juga