Delegate Classe

Definição

Representa um representante que é uma estrutura de dados que faz referência a um método estático ou a uma classe e a um método de instância daquela 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 Delegate classe é a classe base para tipos delegados. No entanto, somente o sistema e os compiladores podem derivar explicitamente da Delegate classe ou da MulticastDelegate classe . Também não é permitido derivar um novo tipo de um tipo delegado. A Delegate classe não é considerada um tipo delegado; é uma classe usada para derivar tipos de delegado.

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

Observação

O Common Language Runtime fornece um Invoke método 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 Invoke método é útil na reflexão quando você deseja encontrar a assinatura do tipo delegado.

O Common Language Runtime fornece métodos e EndInvoke cada tipo BeginInvoke de delegado 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 oculto this 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 está fechado sobre seu primeiro argumento.

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

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 oculto this 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, pois 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, essa 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.

Observação

Os idiomas gerenciados usam os Combine métodos e Remove para implementar operações delegadas. Os exemplos incluem as AddHandler instruções 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.

Observação

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 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 de 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 representante que é uma estrutura de dados que faz referência a um método estático ou a uma classe e a um método de instância daquela classe.

Method

Obtém o método representado pelo delegado.

Target

Obtém a instância da classe em que 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 representantes.

Combine(Delegate[])

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

CombineImpl(Delegate)

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

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 em falhas especificado a ser associado.

CreateDelegate(Type, Object, MethodInfo)

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

CreateDelegate(Type, Object, MethodInfo, Boolean)

Cria um delegado do tipo especificado que representa o método de instância ou estático especificado, com o primeiro argumento especificado e o comportamento especificado na falha para 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 da 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 da 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 da 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 (associação tardia) o método representado pelo delegado atual.

DynamicInvokeImpl(Object[])

Invoca dinamicamente (associação tardia) o método representado pelo delegado atual.

EnumerateInvocationList<TDelegate>(TDelegate)

Representa um representante que é uma estrutura de dados que faz referência a um método estático ou a uma classe e a um método de instância daquela 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 Object atual.

(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