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
. Это также может быть метод, возвращающий значение, которое игнорируется.) Как правило, такой метод используется для выполнения операции.
Примечание
Чтобы сослаться на метод, который не имеет параметров и возвращает значение, используйте вместо него универсальный Func<TResult> делегат.
При использовании делегата Action не нужно явно определять делегат, который инкапсулирует процедуру без параметров. Например, следующий код явно объявляет делегат с именем ShowValue
и назначает ссылку Name.DisplayToWindow
на метод экземпляра его экземпляру делегата.
using namespace System;
using namespace System::Windows::Forms;
public delegate void ShowValue();
public ref class Name
{
private:
String^ instanceName;
public:
Name(String^ name)
{
instanceName = name;
}
void DisplayToConsole()
{
Console::WriteLine(this->instanceName);
}
void DisplayToWindow()
{
MessageBox::Show(this->instanceName);
}
};
int main()
{
Name^ testName = gcnew Name(L"Koani");
ShowValue^ showMethod;
showMethod = gcnew ShowValue(testName, &Name::DisplayToWindow);
showMethod();
return 0;
}
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.Windows.Forms.dll>
using namespace System;
using namespace System::Windows::Forms;
public ref class Name
{
private:
String^ instanceName;
public:
Name(String^ name)
{
instanceName = name;
}
void DisplayToConsole()
{
Console::WriteLine(this->instanceName);
}
void DisplayToWindow()
{
MessageBox::Show(this->instanceName);
}
};
int main()
{
Name^ testName = gcnew Name(L"Koani");
System::Action^ showMethod;
showMethod += gcnew Action(testName, &Name::DisplayToWindow);
showMethod();
return 0;
}
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) |
Получает объект, представляющий метод, представленный указанным делегатом. |