Action Delegar
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Encapsula um método que não tem parâmetros e não retorna um valor.
public delegate void Action();
public delegate void Action();
type Action = delegate of unit -> unit
Public Delegate Sub Action()
Comentários
Você pode usar esse delegado para passar um método como um parâmetro sem declarar explicitamente um delegado personalizado. O método encapsulado deve corresponder à assinatura do método definida por esse delegado. Isso significa que o método encapsulado não deve ter parâmetros e nenhum valor retornado. (Em C#, o método deve retornar void
. Em F#, a função ou o método deve retornar unit
. No Visual Basic, ele deve ser definido pelo Sub
constructo ...End Sub
. Ele também pode ser um método que retorna um valor que é ignorado.) Normalmente, esse método é usado para executar uma operação.
Observação
Para fazer referência a um método que não tem parâmetros e retorna um valor, use o delegado genérico Func<TResult> .
Ao usar o Action delegado, você não precisa definir explicitamente um delegado que encapsula um procedimento sem parâmetros. Por exemplo, o código a seguir declara explicitamente um delegado chamado ShowValue
e atribui uma referência ao Name.DisplayToWindow
método de instância à sua instância delegada.
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
O exemplo a seguir simplifica esse código instanciando o Action delegado em vez de definir explicitamente um novo delegado e atribuir um método nomeado a ele.
#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
Você também pode usar o Action delegado com métodos anônimos em C#, como ilustra o exemplo a seguir. (Para obter uma introdução aos métodos anônimos, consulte Métodos anônimos.)
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();
}
}
Você também pode atribuir uma expressão lambda a uma Action instância de delegado, como ilustra o exemplo a seguir. (Para obter uma introdução às expressões lambda, consulte Expressões Lambda (C#) ou Expressões Lambda (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
Métodos de Extensão
GetMethodInfo(Delegate) |
Obtém um objeto que representa o método representado pelo delegado especificado. |