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
[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
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
[<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
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

Observações

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

A maioria das linguagens implementa uma delegate palavra-chave, e os compiladores dessas linguagens conseguem derivar da MulticastDelegate classe; por isso, os utilizadores devem usar a delegate palavra-chave fornecida pela língua.

Note

O runtime da linguagem comum fornece um Invoke método para cada tipo de delegado, com a mesma assinatura do delegado. Não tens de chamar este método explicitamente de C# ou Visual Basic porque os compiladores chamam-no automaticamente. O Invoke método é útil na reflexão quando se quer encontrar a assinatura do tipo de delegado.

O runtime da linguagem comum fornece a cada tipo de delegado e BeginInvokeEndInvoke métodos, permitindo a invocação assíncrona do delegado. Para mais informações sobre estes métodos, veja Chamar Métodos Síncronos Assíncronos.

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

  • Um método de instância de um tipo e um objeto alvo atribuível a esse tipo.
  • Um método de instância de um tipo, com o parâmetro oculto this exposto na lista formal de parâmetros. Diz-se que o delegado é um delegado de instância aberta.
  • Um método estático.
  • Um método estático e um objeto alvo atribuível ao primeiro parâmetro do método. Diz-se que o delegado está fechado quanto ao seu primeiro argumento.

Para mais informações sobre a ligação de delegados, veja a CreateDelegate(Type, Object, MethodInfo, Boolean) sobrecarga de métodos.

Quando um delegado representa um método de instância fechado sobre o 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 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, armazena uma referência ao ponto de entrada do método. A assinatura do delegado deve incluir o parâmetro oculto this na sua lista formal de parâmetros; neste caso, o delegado não tem referência a um objeto alvo, e um objeto alvo 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 o seu primeiro argumento, o delegado armazena uma referência ao ponto de entrada do método e uma referência a um objeto alvo 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 alvo. Este primeiro argumento deve ser um tipo de referência.

A lista de invocação de um delegado é um conjunto ordenado de delegados em que cada elemento da lista invoca exatamente um dos métodos representados pelo delegado. Uma lista de invocações pode conter métodos duplicados. Durante uma invocação, os métodos são invocados pela ordem em que aparecem na lista de invocações. Um delegado tenta invocar todos os métodos da sua lista de invocações; Os duplicados são invocados uma vez por cada vez que aparecem na lista de invocações. Os delegados são imutáveis; Uma vez criada, a lista de invocações de um delegado não muda.

Os delegados são designados por multicast, ou combináveis, porque um delegado pode invocar um ou mais métodos e podem ser usados em operações de combinação.

Operações de combinação, como Combine e Remove, não alteram os delegados existentes. Em vez disso, tal operação devolve 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 devolve um delegado inalterado quando a operação solicitada não tem efeito.

Note

As linguagens geridas utilizam os Combine métodos e Remove para implementar operações de delegado. Exemplos incluem as instruções AddHandler e RemoveHandler em Visual Basic e os operadores += e -= nos tipos de delegados em C#.

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

Note

Delegados genéricos que são compatíveis com atribuição devido à variância não são necessariamente combináveis. Para serem combináveis, os tipos têm de coincidir exatamente. Por exemplo, suponha que uma classe nomeada Derived é derivada de uma classe nomeada Base. Um delegado de tipo Action<Base> (Action(Of Base) em 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 coincidem exatamente.

Se um método invocado lançar uma exceção, o método deixa de ser executado, a exceção é passada de volta ao chamador do delegado, e os métodos restantes na lista de invocação não são invocados. Apanhar a exceção no chamador não altera este comportamento.

Quando a assinatura dos métodos invocados por um delegado inclui um valor de retorno, o delegado devolve o valor de retorno 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ções a executar-se sequencialmente e a atualizar 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 só uma referência ao ponto de entrada do método, mas também uma referência à instância da classe. Ao contrário dos ponteiros de função, os delegados são orientados a objetos e seguros para tipos.

Para exemplos, veja Observações suplementares da API para System.Delegate.CreateDelegate.

Construtores

Name Description
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 a partir da classe especificada.

Propriedades

Name Description
Method

Obtém o método representado pelo delegado.

Target

Obtém a instância de classe em que o delegado atual invoca o método de instância.

Métodos

Name Description
Clone()

Cria uma cópia superficial do delegado.

Combine(Delegate, Delegate)

Concatena as listas de invocações de dois delegados.

Combine(Delegate[])

Concatena as listas de invocações de um array de delegados.

CombineImpl(Delegate)

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

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 na ligação.

CreateDelegate(Type, MethodInfo)

Cria um delegado do tipo especificado para representar o método 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 em caso de falha em vinculação.

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, String, Boolean, Boolean)

Cria um delegado do tipo especificado que representa o método de instância especificado a invocar na instância de classe especificada, com a sensibilidade a maiúsculas e minúsculas especificadas e o comportamento especificado em caso de falha em vinculação.

CreateDelegate(Type, Object, String, Boolean)

Cria um delegado do tipo especificado que representa o método de instância especificado para invocar na instância de classe especificada com a sensibilidade a maiúsculas e minúsculas especificada.

CreateDelegate(Type, Object, String)

Cria um delegado do tipo especificado que representa o método de instância especificado a invocar na instância de classe 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 sensibilidade a maiúsculas e minúsculas especificadas e o comportamento especificado em caso de falha em vinculação.

CreateDelegate(Type, Type, String, Boolean)

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

CreateDelegate(Type, Type, String)

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

DynamicInvoke(Object[])

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

DynamicInvokeImpl(Object[])

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

Equals(Object)

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

GetHashCode()

Devolve um código de hash para o delegado.

GetInvocationList()

Devolve a lista de invocações do delegado.

GetMethodImpl()

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

GetObjectData(SerializationInfo, StreamingContext)

Não suportado.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
Remove(Delegate, Delegate)

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

RemoveAll(Delegate, Delegate)

Remove todas as ocorrências da lista de invocações de um delegado da lista de invocações de outro delegado.

RemoveImpl(Delegate)

Remove a lista de invocações de um delegado da lista de invocações de outro delegado.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)

Operadores

Name Description
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 da Extensão

Name Description
GetMethodInfo(Delegate)

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

Aplica-se a

Ver também