Leitura recomendada
Objetivos
O tipo de dado delegate representa uma referência para um método, podendo ter parâmetros e retorno de dado.
A idéia do delegate em C# é equivalente ao ponteiro para função em C e C++.
Para utilizar um delegate, precisamos declarar um tipo de delegate com parametros e tipo de retorno com
posterior atribuição de um método que atenda ao que foi predefinido.
Com delegate, podemos criar métodos anônimos e utilizar os tipos de delegate Action,
Func e Predicate.
Para utilizar Delegates precisamos adicionar o namespace System.
Um tipo de dado delegate é declarado utilizando a palavra reservada delegate de acordo com as sintaxes
abaixo.
Sintaxe 1
modificador_acesso delegate tipo_retorno tipo_delegate();
Sintaxe 2
modificador_acesso tipo_delegate nome_delegate;
nome_delegate nome_variavel;
Sintaxe 3
nome_variavel = nome_metodo;
Na primeira sintaxe definimos um tipo de delegate com retorno. Na segunda sintaxe, a declaramos
um variável tendo o novo tipo delegate como tipo de dado. Na terceira e última sintaxe, é demostrado a
atribuição de um método a uma variável.
Exemplo 1
using System;
public class Program
{
//Criação do tipo delegate
public delegate void MeuDelegate();
//Método para o tipo MeuDelegate
public static void MeuMetodo()// static Main
{
//omitido
}
public static void Main()
{
//variável
MeuDelegate delPrint; = MeuMetodo;
//atribuição
delPrint = MeuMetodo;
}
}
Saída
-
Delegate com parâmetro e retorno
Como delegate é uma referência para um método, esse possue as mesma características em relação
à declaração de parâmetros e também retorno.
Sintaxe 1
modificador_acesso delegate tipo_retorno nome_delegate(lista_parametros);
Exemplo 2
using System;
public class Program
{
public delegate void MeuDelegateParametro(string param);
public delegate int MeuDelegateRetorno(int param);
public static void MeuMetodo(string p)// static Main
{
Console.WriteLine(p);
}
//Sobrecarga
public static int MeuMetodo(int p)// static Main
{
return p*2;
}
public static void Main()
{
MeuDelegateParametro Print = MeuMetodo;
Print("delegate C#");
MeuDelegateRetorno Dobro = MeuMetodo;
Console.WriteLine(Dobro(4));
}
}
Saída
metodo anonimo como parametro
4
O uso das palavras reservadas ref e out, vistas nos conceitos de passagem por valor e
referência em C# POO: Métodos, também podem ser utilizados.
Assim como em C/C++ que podem passar funções como parâmetro/argumento, C# também permite que um delegate seja
utilizado da mesma forma. Abaixo a sintaxe que mostra o que foi discutido:
Sintaxe
modificador_acesso tipo_retorno nome_metodo(tipo_delegate nome_parametro);
Exemplo 3
using System;
public class Program
{
//tipo delegate
public delegate void TipoDelegate(string param);
//método atribuído ao delegate
public static void MeuMetodo(string p)// static Main
{
Console.WriteLine(p);
}
//método que recebe delegate como parâmetro
public static void MetodoDelegate(TipoDelegate Print, string msg)// static Main
{
Print(msg);
}
public static void Main()
{
TipoDelegate Print = MeuMetodo;
MetodoDelegate(Print,"delegate como parametro");
}
}
Saída
delegate como parametro
Métodos anônimos/Delegates anônimos
Outra forma de utilizar delegates é para a criação de métodos anônimos. Esses possuem as mesma características
em relação ao uso de um ou mais parâmetros, retorno e uso de ref e out.
Diferente dos delegates vistos até agora, um método anônimo não precisa ter um nome, mas precisa utilizar
a palavra reservada delegate como mostrado na sintaxe abaixo:
Sintaxe
tipo_delegate nome_variavel = delegate(lista_parametros)
{
//corpo
}
Exemplo 4
using System;
public class Program
{
public delegate void TipoDelegate(string param);
public delegate int TipoRetorno(int param);
public static void Main()
{
TipoDelegate Print = delegate(string param)
{
Console.WriteLine(param);
};
TipoRetorno Dobro = delegate(int param)
{
return param*2;
};
Print("metodo anonimo como parametro");
Console.WriteLine(Dobro(2));
}
}
Saída
metodo anonimo como parametro
4
Métodos anônimos como parâmetro
Os métodos anônimos também podem ser utilizados como parâmetro de métodos. Abaixo a sintaxe que
mostra a declaração de um método que recebe um método anônimo como argumento:
Sintaxe 1
modificador_acesso delegate tipo_retorno nome_delegate(parametros);
Sintaxe 2
modificador_acesso tipo_retorno nome_metodo(tipo_delegate nome_parametro);
Sintaxe 3
nome_metodo(delegate(lista_parametros){ /*corpo */ });
Exemplo 5
using System;
public class Program
{
//tipo delegate
public delegate void TipoDelegate(string param);
//método que recebe delegate
public static void Metodo(TipoDelegate Print, string msg)// static Main
{
Print(msg);
}
public static void Main()
{
//método anônimo passado como argumento
Metodo(delegate(string p)
{
Console.WriteLine(p);
}, "metodo anonimo como parametro");
}
}
Saída
metodo anonimo como parametro
Como criamos um tipo de dado delegate, podemos também declarar tipos derivados como array
de delegates. A atribuição de métodos aos elementos de um array é feita
utilizando a posição/índice passado como argumento para o indexador [].
Sintaxe: Declaração
modificador_acesso tipo_delegate[] nome_array; //atributo
tipo_delegate[] nome_array; //variável
Sintaxe: Atribuição
tipo_delegate[] nome_array = { nome_metodo1, nome_metodo2, nome_metodoN };
nome_array[indice] = nome_metodo;
Sintaxe: Uso
nome_array[indice](lista_argumentos)
Exemplo 6
using System;
public class Program
{
public delegate void TipoDelegate();
//static Main
public static void Metodo1(){ Console.WriteLine("Metodo1");}
public static void Metodo2(){ Console.WriteLine("Metodo2");}
public static void Metodo3(){ Console.WriteLine("Metodo3");}
public static void Main()
{
TipoDelegate[] vetorDelegate = { Metodo1, Metodo2, Metodo3};
vetorDelegate[0]();
vetorDelegate[1]();
vetorDelegate[2]();
}
}
Saída
Metodo1
Metodo2
Metodo3
Histórico de atualizações
- 11/10/2024 - revisão 1 - Correção: Sintaxes, exemplos; Ajustes pontuais
- 21/03/2024 - versão inicial
Os cursos oferecidos nesta página são cursos fornecidos por parceiros. Ao comprar um curso clicando
em seu banner, você está ajudando a manter o projeto TutorialDev vivo. Os sites dos cursos parceiros utilizam cookies.