Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Func(Of TResult)-Delegat

 

Veröffentlicht: Oktober 2016

Kapselt eine Methode, die über keine Parameter verfügt und einen Wert des Typs zurückgibt, der vom TResult-Parameter angegeben wird.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

Public Delegate Function Func(Of Out TResult) As TResult

Rückgabewert

Type: TResult

Der Rückgabewert der Methode, die dieser Delegat kapselt.

Typparameter

OutTResult

Der Typ des Rückgabewerts der Methode, die dieser Delegat kapselt.

Sie können diesen Delegaten verwenden, um eine Methode darzustellen, die als Parameter übergeben werden kann, ohne explizit einen benutzerdefinierten Delegaten zu deklarieren. Der gekapselte Methode muss der Methodensignatur entsprechen, die von diesem Delegaten definiert ist. Dies bedeutet, dass die gekapselte Methode keine Parameter besitzen darf und einen Wert zurückgeben muss.

System_CAPS_noteHinweis

Um eine Methode zu verweisen, hat keine Parameter und gibt void (oder in Visual Basic deklariert wird als eine Sub sondern als eine Function), verwenden die Action stattdessen delegieren.

Bei Verwendung der Func<'TResult> Delegaten, Sie müssen nicht explizit einen Delegaten definieren, der eine parameterlose Methode kapselt. Der folgende Code deklariert beispielsweise explizit einen Delegaten mit dem Namen WriteMethod und weist einen Verweis auf die OutputTarget.SendToFile Instanzmethode-Instanzmethode zu.

Imports System.IO

Delegate Function WriteMethod As Boolean

Module TestDelegate
   Public Sub Main()
      Dim output As New OutputTarget()
      Dim methodCall As WriteMethod = AddressOf output.SendToFile
      If methodCall() Then 
         Console.WriteLine("Success!")
      Else
         Console.WriteLine("File write operation failed.")
      End If      
   End Sub
End Module

Public Class OutputTarget
   Public Function SendToFile() As Boolean
      Try
         Dim fn As String = Path.GetTempFileName
         Dim sw As StreamWriter = New StreamWriter(fn)
         sw.WriteLine("Hello, World!")
         sw.Close      
         Return True
      Catch
         Return False
      End Try
   End Function
End Class

Im folgende Beispiel wird dieser Code vereinfacht, durch die Instanziierung der Func<'TResult> Delegaten nicht explizit einen neuen Delegaten definieren und eine benannte Methode zugewiesen wird.

Imports System.IO

Module TestDelegate
   Public Sub Main()
      Dim output As New OutputTarget()
      Dim methodCall As Func(Of Boolean) = AddressOf output.SendToFile
      If methodCall() Then 
         Console.WriteLine("Success!")
      Else
         Console.WriteLine("File write operation failed.")
      End If      
   End Sub
End Module

Public Class OutputTarget
   Public Function SendToFile() As Boolean
      Try
         Dim fn As String = Path.GetTempFileName
         Dim sw As StreamWriter = New StreamWriter(fn)
         sw.WriteLine("Hello, World!")
         sw.Close      
         Return True
      Catch
         Return False
      End Try
   End Function
End Class

Sie können die Func<'TResult> -Delegaten mit anonymen Methoden in c#, wie im folgenden Beispiel veranschaulicht. (Eine Einführung in anonyme Methoden finden Sie unter Anonyme Methoden (C#-Programmierhandbuch).)

using System;
using System.IO;

public class Anonymous
{
   public static void Main()
   {
      OutputTarget output = new OutputTarget();
      Func<bool> methodCall = delegate() { return output.SendToFile(); };
      if (methodCall())
         Console.WriteLine("Success!"); 
      else
         Console.WriteLine("File write operation failed.");
   }
}

public class OutputTarget
{
   public bool SendToFile()
   {
      try
      {
         string fn = Path.GetTempFileName();
         StreamWriter sw = new StreamWriter(fn);
         sw.WriteLine("Hello, World!");
         sw.Close();
         return true;
      }  
      catch
      {
         return false;
      }
   }
}

Sie können auch einen Lambda-Ausdruck zuweisen einer Func(Of T, TResult) zu delegieren, wie im folgenden Beispiel veranschaulicht. (Eine Einführung in Lambda-Ausdrücke finden Sie unter Lambda Expressions (Visual Basic) und Lambda-Ausdrücke (C#-Programmierhandbuch).)

Imports System.IO

Module TestDelegate
   Public Sub Main()
      Dim output As New OutputTarget()
      Dim methodCall As Func(Of Boolean) = Function() output.SendToFile()
      If methodCall() Then 
         Console.WriteLine("Success!")
      Else
         Console.WriteLine("File write operation failed.")
      End If      
   End Sub
End Module

Public Class OutputTarget
   Public Function SendToFile() As Boolean
      Try
         Dim fn As String = Path.GetTempFileName
         Dim sw As StreamWriter = New StreamWriter(fn)
         sw.WriteLine("Hello, World!")
         sw.Close      
         Return True
      Catch
         Return False
      End Try
   End Function
End Class

Der zugrunde liegende Typ eines Lambda-Ausdrucks ist einer der generischen Func Delegaten. Dadurch können einen Lambda-Ausdruck als Parameter zu übergeben, ohne explizit einen Delegaten zugewiesen werden. Insbesondere, da viele Methoden von Typen in der System.Linq -Namespace haben Func Parameter können übergeben dieser Methoden einen Lambda-Ausdruck ohne explizit zu instanziieren einer Func delegieren.

Wenn Sie eine aufwändige Berechnungen, die Sie möchten nur ausgeführt verfügen, wenn das Ergebnis tatsächlich benötigt wird, können Sie die rechenintensive Funktion Zuweisen einer Func<'TResult> delegieren. Die Ausführung der Funktion kann dann verzögert werden, bis eine Eigenschaft, die auf den Wert zugreift, in einem Ausdruck verwendet wird. Im Beispiel im nächsten Abschnitt veranschaulicht dies.

Im folgenden Beispiel wird veranschaulicht, wie ein Delegat zu verwenden, die keine Parameter akzeptiert. Dieser Code erstellt eine generische Klasse namens LazyValue bei dem ein Feld vom Typ Func<'TResult>. Dieses Delegatfeld kann speichern einen Verweis auf jede Funktion, die den Typparameter des Typs, entspricht der Wert wieder der LazyValue Objekt. Die LazyValue -Typ weist außerdem eine Value -Eigenschaft, die die Funktion ausführt (sofern sie nicht bereits ausgeführt wurde) und der resultierende Wert zurückgegeben.

Im Beispiel zwei Methoden erstellt und instanziiert Sie zwei LazyValue Objekte mit Lambda-Ausdrücken, die diese Methoden aufrufen. Die Lambda-Ausdrücke nehmen keine Parameter an, da sie nur eine Methode aufrufen müssen. Die zwei Methoden werden ausgeführt, wie die Ausgabe zeigt, nur, wenn der Wert von jedem LazyValue Objekt abgerufen wird.

Public Module Func
   Public Sub Main()
      ' Note that each lambda expression has no parameters.
      Dim lazyOne As New LazyValue(Of Integer)(Function() ExpensiveOne())
      Dim lazyTwo As New LazyValue(Of Long)(Function() ExpensiveTwo("apple")) 

      Console.WriteLine("LazyValue objects have been created.")

      ' Get the values of the LazyValue objects.
      Console.WriteLine(lazyOne.Value)
      Console.WriteLine(lazyTwo.Value)
   End Sub

   Public Function ExpensiveOne() As Integer
      Console.WriteLine()
      Console.WriteLine("ExpensiveOne() is executing.")
      Return 1
   End Function

   Public Function ExpensiveTwo(input As String) As Long
      Console.WriteLine() 
      Console.WriteLine("ExpensiveTwo() is executing.")
      Return input.Length
   End Function
End Module

Public Class LazyValue(Of T As Structure)
   Private val As Nullable(Of T)
   Private getValue As Func(Of T)

   ' Constructor.
   Public Sub New(func As Func(Of T))
      Me.val = Nothing
      Me.getValue = func
   End Sub

   Public ReadOnly Property Value() As T
      Get
         If Me.val Is Nothing Then
            ' Execute the delegate.
            Me.val = Me.getValue()
         End If   
         Return CType(val, T)
      End Get
   End Property
End Class

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 3.5
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: