Action Делегат
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Инкапсулирует метод, который не имеет параметров и не возвращает значение.
public delegate void Action();
public delegate void Action();
type Action = delegate of unit -> unit
Public Delegate Sub Action()
Комментарии
Этот делегат можно использовать для передачи метода в качестве параметра без явного объявления пользовательского делегата. Инкапсулированный метод должен соответствовать сигнатуре метода, определенной этим делегатом. Это означает, что инкапсулированный метод не должен иметь параметров и нет возвращаемого значения. (В C#метод должен возвращать void. В F# функция или метод должен возвращать unit. В Visual Basic он должен быть определен Sub... конструкция End Sub. Это также может быть метод, который возвращает значение, которое игнорируется.) Как правило, такой метод используется для выполнения операции.
Note
Чтобы ссылаться на метод без параметров и возвращать значение, используйте универсальный Func<TResult> делегат.
При использовании делегата Action не нужно явно определять делегат, который инкапсулирует процедуру без параметров. Например, следующий код явным образом объявляет делегат с именем ShowValue и назначает ссылку на метод экземпляра Name.DisplayToWindow для своего экземпляра делегата.
using System;
using System.Windows.Forms;
public delegate void ShowValue();
public class Name
{
private string instanceName;
public Name(string name)
{
this.instanceName = name;
}
public void DisplayToConsole()
{
Console.WriteLine(this.instanceName);
}
public void DisplayToWindow()
{
MessageBox.Show(this.instanceName);
}
}
public class testTestDelegate
{
public static void Main()
{
Name testName = new Name("Koani");
ShowValue showMethod = testName.DisplayToWindow;
showMethod();
}
}
open System.Windows.Forms
type ShowValue = delegate of unit -> unit
type Name(name) =
member _.DisplayToConsole() =
printfn "%s" name
member _.DisplayToWindow() =
MessageBox.Show name |> ignore
let testName = Name "Koani"
let showMethod = ShowValue testName.DisplayToWindow
showMethod.Invoke()
Public Delegate Sub ShowValue
Public Class Name
Private instanceName As String
Public Sub New(name As String)
Me.instanceName = name
End Sub
Public Sub DisplayToConsole()
Console.WriteLine(Me.instanceName)
End Sub
Public Sub DisplayToWindow()
MsgBox(Me.instanceName)
End Sub
End Class
Public Module testDelegate
Public Sub Main()
Dim testName As New Name("Koani")
Dim showMethod As ShowValue = AddressOf testName.DisplayToWindow
showMethod
End Sub
End Module
В следующем примере этот код упрощается путем создания экземпляра Action делегата вместо явного определения нового делегата и назначения именованного метода.
using System;
using System.Windows.Forms;
public class Name
{
private string instanceName;
public Name(string name)
{
this.instanceName = name;
}
public void DisplayToConsole()
{
Console.WriteLine(this.instanceName);
}
public void DisplayToWindow()
{
MessageBox.Show(this.instanceName);
}
}
public class testTestDelegate
{
public static void Main()
{
Name testName = new Name("Koani");
Action showMethod = testName.DisplayToWindow;
showMethod();
}
}
open System
open System.Windows.Forms
type Name(name) =
member _.DisplayToConsole() =
printfn "%s" name
member _.DisplayToWindow() =
MessageBox.Show name |> ignore
let testName = Name "Koani"
// unit -> unit functions and methods can be cast to Action.
let showMethod = Action testName.DisplayToWindow
showMethod.Invoke()
Public Class Name
Private instanceName As String
Public Sub New(name As String)
Me.instanceName = name
End Sub
Public Sub DisplayToConsole()
Console.WriteLine(Me.instanceName)
End Sub
Public Sub DisplayToWindow()
MsgBox(Me.instanceName)
End Sub
End Class
Public Module testDelegate
Public Sub Main()
Dim testName As New Name("Koani")
Dim showMethod As Action = AddressOf testName.DisplayToWindow
showMethod
End Sub
End Module
Вы также можете использовать Action делегат с анонимными методами в C#, как показано в следующем примере. (Введение в анонимные методы см. в разделе "Анонимные методы".)
using System;
using System.Windows.Forms;
public class Name
{
private string instanceName;
public Name(string name)
{
this.instanceName = name;
}
public void DisplayToConsole()
{
Console.WriteLine(this.instanceName);
}
public void DisplayToWindow()
{
MessageBox.Show(this.instanceName);
}
}
public class Anonymous
{
public static void Main()
{
Name testName = new Name("Koani");
Action showMethod = delegate() { testName.DisplayToWindow();} ;
showMethod();
}
}
Можно также назначить лямбда-выражение экземпляру Action делегата, как показано в следующем примере. (Введение в лямбда-выражения см. в лямбда-выражениях (C#) или лямбда-выражениях (F#).)
using System;
using System.Windows.Forms;
public class Name
{
private string instanceName;
public Name(string name)
{
this.instanceName = name;
}
public void DisplayToConsole()
{
Console.WriteLine(this.instanceName);
}
public void DisplayToWindow()
{
MessageBox.Show(this.instanceName);
}
}
public class LambdaExpression
{
public static void Main()
{
Name testName = new Name("Koani");
Action showMethod = () => testName.DisplayToWindow();
showMethod();
}
}
open System
open System.Windows.Forms
type Name(name) =
member _.DisplayToConsole() =
printfn "%s" name
member _.DisplayToWindow() =
MessageBox.Show name |> ignore
let testName = Name "Koani"
let showMethod = Action(fun () -> testName.DisplayToWindow())
showMethod.Invoke()
Public Class Name
Private instanceName As String
Public Sub New(name As String)
Me.instanceName = name
End Sub
Public Function DisplayToConsole() As Integer
Console.WriteLine(Me.instanceName)
Return 0
End Function
Public Function DisplayToWindow() As Integer
Return MsgBox(Me.instanceName)
End Function
End Class
Module LambdaExpression
Public Sub Main()
Dim name1 As New Name("Koani")
Dim methodCall As Action = Sub() name1.DisplayToWindow()
methodCall()
End Sub
End Module
Методы расширения
| Имя | Описание |
|---|---|
| GetMethodInfo(Delegate) |
Возвращает объект, представляющий метод, представленный указанным делегатом. |