Compartilhar via


Delegate Classe

Definição

Representa um delegado, que é uma estrutura de dados que se refere a um método estático ou a uma instância de classe e a um método de instância dessa classe.

public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Delegate = class
    interface ICloneable
    interface ISerializable
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
Herança
Delegate
Derivado
Atributos
Implementações

Comentários

A classe Delegate é a classe base para tipos delegados. No entanto, somente o sistema e os compiladores podem derivar explicitamente da classe Delegate ou da classe MulticastDelegate. Também não é permitido derivar um novo tipo de um tipo delegado. A classe Delegate não é considerada um tipo delegado; é uma classe usada para derivar tipos de delegado.

A maioria dos idiomas implementa uma palavra-chave delegate e os compiladores para esses idiomas são capazes de derivar da classe MulticastDelegate; portanto, os usuários devem usar a palavra-chave delegate fornecida pelo idioma.

Nota

O common language runtime fornece um método Invoke para cada tipo de delegado, com a mesma assinatura que o delegado. Você não precisa chamar esse método explicitamente de C#, Visual Basic ou Visual C++, porque os compiladores o chamam automaticamente. O método Invoke é útil em reflexão quando você deseja encontrar a assinatura do tipo delegado.

O common language runtime fornece a cada tipo delegado métodos BeginInvoke e EndInvoke para habilitar a invocação assíncrona do delegado. Para obter mais informações sobre esses métodos, consulte Chamando métodos síncronos de forma assíncrona.

A declaração de um tipo delegado estabelece um contrato que especifica a assinatura de um ou mais métodos. Um delegado é uma instância de um tipo delegado que tem referências a:

  • Um método de instância de um tipo e um objeto de destino atribuível a esse tipo.

  • Um método de instância de um tipo, com o parâmetro this oculto exposto na lista de parâmetros formais. Diz-se que o delegado é um delegado de instância aberta.

  • Um método estático.

  • Um método estático e um objeto de destino atribuível ao primeiro parâmetro do método. Diz-se que o delegado foi fechado por causa de seu primeiro argumento.

Para obter mais informações sobre a associação de delegados, consulte a sobrecarga do método CreateDelegate(Type, Object, MethodInfo, Boolean).

Quando um delegado representa um método de instância fechado sobre seu primeiro argumento (o caso mais comum), o delegado armazena uma referência ao ponto de entrada do método e uma referência a um objeto, chamado de destino, que é de um tipo atribuível ao tipo que definiu o método. Quando um delegado representa um método de instância aberta, ele armazena uma referência ao ponto de entrada do método. A assinatura delegada deve incluir o parâmetro this oculto em sua lista de parâmetros formais; nesse caso, o delegado não tem uma referência a um objeto de destino e um objeto de destino deve ser fornecido quando o delegado é invocado.

Quando um delegado representa um método estático, o delegado armazena uma referência ao ponto de entrada do método. Quando um delegado representa um método estático fechado sobre seu primeiro argumento, o delegado armazena uma referência ao ponto de entrada do método e uma referência a um objeto de destino atribuível ao tipo do primeiro argumento do método. Quando o delegado é invocado, o primeiro argumento do método estático recebe o objeto de destino. Esse primeiro argumento deve ser um tipo de referência.

A lista de invocação de um delegado é um conjunto ordenado de delegados no qual cada elemento da lista invoca exatamente um dos métodos representados pelo delegado. Uma lista de invocação pode conter métodos duplicados. Durante uma invocação, os métodos são invocados na ordem em que aparecem na lista de invocação. Um delegado tenta invocar todos os métodos em sua lista de invocação; as duplicatas são invocadas uma vez para cada vez que aparecem na lista de invocação. Delegados são imutáveis; depois de criada, a lista de invocação de um delegado não é alterada.

Os delegados são chamados de multicast ou combináveis, porque um delegado pode invocar um ou mais métodos e pode ser usado na combinação de operações.

A combinação de operações, como Combine e Remove, não altera os delegados existentes. Em vez disso, tal operação retorna um novo delegado que contém os resultados da operação, um delegado inalterado ou null. Uma operação de combinação retorna null quando o resultado da operação é um delegado que não faz referência a pelo menos um método. Uma operação de combinação retorna um delegado inalterado quando a operação solicitada não tem efeito.

Nota

Os idiomas gerenciados usam os métodos Combine e Remove para implementar operações delegadas. Exemplos incluem as instruções AddHandler e RemoveHandler no Visual Basic e os operadores += e -= em tipos delegados em C#.

A partir do .NET Framework 4, os tipos de delegado genéricos podem ter parâmetros de tipo variante. Parâmetros de tipo contravariante podem ser usados como tipos de parâmetro do delegado e um parâmetro de tipo covariante pode ser usado como o tipo de retorno. Esse recurso permite que tipos delegados genéricos construídos a partir da mesma definição de tipo genérico sejam compatíveis com atribuição se seus argumentos de tipo forem tipos de referência com uma relação de herança, conforme explicado em Covariância e Contravariância.

Nota

Delegados genéricos compatíveis com atribuição devido à variação não são necessariamente combináveis. Para serem combináveis, os tipos devem corresponder exatamente. Por exemplo, suponha que uma classe chamada Derived seja derivada de uma classe chamada Base. Um delegado do tipo Action<Base> (Action(Of Base) no Visual Basic) pode ser atribuído a uma variável do tipo Action<Derived>, mas os dois delegados não podem ser combinados porque os tipos não correspondem exatamente.

Se um método invocado gerar uma exceção, o método interromperá a execução, a exceção será passada de volta para o chamador do delegado e os métodos restantes na lista de invocação não serão invocados. Capturar a exceção no chamador não altera esse comportamento.

Quando a assinatura dos métodos invocados por um delegado inclui um valor retornado, o delegado retorna o valor retornado do último elemento na lista de invocação. Quando a assinatura inclui um parâmetro que é passado por referência, o valor final do parâmetro é o resultado de cada método na lista de invocação sendo executado sequencialmente e atualizando o valor do parâmetro.

O equivalente mais próximo de um delegado em C é um ponteiro de função. Um delegado pode representar um método estático ou um método de instância. Quando o delegado representa um método de instância, o delegado armazena não apenas uma referência ao ponto de entrada do método, mas também uma referência à instância de classe. Ao contrário dos ponteiros de função, os delegados são orientados a objetos e digitam com segurança.

Para obter exemplos, consulte comentários da API Suplementar para System.Delegate.CreateDelegate.

Construtores

Delegate(Object, String)

Inicializa um delegado que invoca o método de instância especificado na instância de classe especificada.

Delegate(Type, String)

Inicializa um delegado que invoca o método estático especificado da classe especificada.

Propriedades

HasSingleTarget

Representa um delegado, que é uma estrutura de dados que se refere a um método estático ou a uma instância de classe e a um método de instância dessa classe.

Method

Obtém o método representado pelo delegado.

Target

Obtém a instância de classe na qual o delegado atual invoca o método de instância.

Métodos

Clone()

Cria uma cópia superficial do delegado.

Combine(Delegate, Delegate)

Concatena as listas de invocação de dois delegados.

Combine(Delegate[])

Concatena as listas de invocação de uma matriz de delegados.

Combine(ReadOnlySpan<Delegate>)

Representa um delegado, que é uma estrutura de dados que se refere a um método estático ou a uma instância de classe e a um método de instância dessa classe.

CombineImpl(Delegate)

Concatena as listas de invocação do delegado multicast especificado (combinável) e do delegado multicast atual (combinável).

CreateDelegate(Type, MethodInfo)

Cria um delegado do tipo especificado para representar o método especificado.

CreateDelegate(Type, MethodInfo, Boolean)

Cria um delegado do tipo especificado para representar o método estático especificado, com o comportamento especificado em caso de falha ao associar.

CreateDelegate(Type, Object, MethodInfo)

Cria um delegado do tipo especificado que representa o método estático ou de instância especificado, com o primeiro argumento especificado.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Cria um delegado do tipo especificado que representa o método estático ou de instância especificado, com o primeiro argumento especificado e o comportamento especificado sobre a falha na associação.

CreateDelegate(Type, Object, String)

Cria um delegado do tipo especificado que representa o método de instância especificado a ser invocado na instância de classe especificada.

CreateDelegate(Type, Object, String, Boolean)

Cria um delegado do tipo especificado que representa o método de instância especificado a ser invocado na instância de classe especificada com a diferenciação de maiúsculas e minúsculas especificada.

CreateDelegate(Type, Object, String, Boolean, Boolean)

Cria um delegado do tipo especificado que representa o método de instância especificado a ser invocado na instância de classe especificada, com a diferenciação de maiúsculas e minúsculas especificada e o comportamento especificado na falha de associação.

CreateDelegate(Type, Type, String)

Cria um delegado do tipo especificado que representa o método estático especificado da classe especificada.

CreateDelegate(Type, Type, String, Boolean)

Cria um delegado do tipo especificado que representa o método estático especificado da classe especificada, com a diferenciação de maiúsculas e minúsculas especificada.

CreateDelegate(Type, Type, String, Boolean, Boolean)

Cria um delegado do tipo especificado que representa o método estático especificado da classe especificada, com a diferenciação de maiúsculas e minúsculas especificada e o comportamento especificado na falha de associação.

DynamicInvoke(Object[])

Invoca dinamicamente (com limite tardio) o método representado pelo delegado atual.

DynamicInvokeImpl(Object[])

Invoca dinamicamente (com limite tardio) o método representado pelo delegado atual.

EnumerateInvocationList<TDelegate>(TDelegate)

Representa um delegado, que é uma estrutura de dados que se refere a um método estático ou a uma instância de classe e a um método de instância dessa classe.

Equals(Object)

Determina se o objeto especificado e o delegado atual são do mesmo tipo e compartilham os mesmos destinos, métodos e lista de invocação.

GetHashCode()

Retorna um código hash para o delegado.

GetInvocationList()

Retorna a lista de invocação do delegado.

GetMethodImpl()

Obtém o método representado pelo delegado atual.

GetObjectData(SerializationInfo, StreamingContext)
Obsoleto.

Não há suporte.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
Remove(Delegate, Delegate)

Remove a última ocorrência da lista de invocação de um delegado da lista de invocação de outro delegado.

RemoveAll(Delegate, Delegate)

Remove todas as ocorrências da lista de invocação de um delegado da lista de invocação de outro delegado.

RemoveImpl(Delegate)

Remove a lista de invocação de um delegado da lista de invocação de outro delegado.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Operadores

Equality(Delegate, Delegate)

Determina se os delegados especificados são iguais.

Inequality(Delegate, Delegate)

Determina se os delegados especificados não são iguais.

Métodos de Extensão

GetMethodInfo(Delegate)

Obtém um objeto que representa o método representado pelo delegado especificado.

Aplica-se a

Confira também