English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Método de Extensão (Extension) do C#

Como o próprio nome sugere, os métodos de extensão são métodos adicionais. Os métodos de extensão permitem que você injete outros métodos sem modificar, derivar ou recompilar a classe, estrutura ou interface original. Você pode adicionar métodos de extensão a suas próprias classes personalizadas, classes do .NET Framework, classes ou interfaces de terceiros.

Definição de métodos de extensão

Os métodos de extensão são do C# 3A nova característica adicionada em .0 permite que você expanda as funcionalidades do código-fonte sem modificar o código-fonte original, através do modo ADD File.

Os requisitos dos métodos de extensão são:

  • Os métodos de extensão devem estar contidos em uma classe marcada com static.

  • A implementação de extensão deve ser estática.

  • O primeiro parâmetro do método de extensão tem o prefixo this, o que indica que é necessário estender o objeto da classe, e a partir do segundo parâmetro, é a lista de parâmetros do método de extensão.

No seguinte exemplo, IsGreaterThan () é um método de extensão do tipo int, que retorna true se o valor da variável int for maior que o parâmetro inteiro fornecido.

int i = 10;
bool result = i.IsGreaterThan(100); //Retorna FALSE

O método IsGreaterThan () não é um método do tipo de dados int (Int32 struct). É um método de extensão escrito pelo programador para o tipo de dados int. Ao incluir o espaço de nomes que define a extensão IsGreaterThan (), o método de extensão IsGreaterThan () estará disponível em toda a aplicação.

 Os métodos de extensão no IntelliSense do Visual Studio têm um símbolo especial, permitindo que você distingua facilmente métodos de classe e métodos de extensão.

Símbolos de métodos de extensão no IntelliSense do Visual Studio

Escrevendo métodos de extensão

Agora, vamos ver como escrever métodos de extensão.

O LINQ é construído sobre métodos de extensão que operam nos tipos IEnumerable e IQueryable.

Os métodos de extensão são, na verdade, um tipo especial de método estático definido em uma classe estática. Para definir um método de extensão, primeiro, defina uma classe estática.

Por exemplo, no seguinte exemplo, criamos uma classe IntExtensions no espaço de nomes ExtensionMethods. A classe IntExtensions conterá todos os métodos de extensão aplicáveis ao tipo de dados int (você pode usar qualquer nome para o espaço de nomes e a classe).

namespace ExtensionMethods
{
    public static class IntExtensions
    {
    }
}

Agora, defina o método estático como método de extensão, onde o primeiro parâmetro do método de extensão especifica o tipo ao qual se aplica a extensão. Usaremos este método de extensão no tipo int. Portanto, deve-se adicionarthis Modificador.

Por exemplo, o método IsGreaterThan() opera sobre int, portanto, o primeiro parâmetro é this int i.

namespace ExtensionMethods
{
    public static class IntExtensions
     {
        public static bool IsGreaterThan(this int i, int value)
        {
            return i > value;
        }
    }
}

Agora, você pode incluir o espaço de nomes ExtensionMethods em qualquer lugar que deseje usar este método de extensão.

Usar método de extensão

using ExtensionMethods;
class Program
{
    static void Main(string[] args)
    {
        int i = 10;
        bool result = i.IsGreaterThan(100); 
        Console.WriteLine(result);
    }
}
Saída:
false
A única diferença entre métodos estáticos comuns e métodos de extensão é que o primeiro parâmetro do método de extensão especifica o tipo sobre o qual o operador será operado, seguido por this Palavra-chave.

Resumo do princípio do método de extensão

  1. O C# suporta apenas métodos de extensão, não suporta propriedades de extensão, eventos de extensão, operadores de extensão, etc.

  2. Métodos de extensão (antes do primeiro parâmetro é o método this) devem ser declarados em classes estáticas não genéricas, e o método de extensão deve ter um parâmetro, e apenas o primeiro parâmetro usa o sinalizador this.

  3. O compilador do C# requer que as classes estáticas onde os métodos de extensão são encontrados tenham escopo de arquivo.

  4. O compilador do C# requer a “importação” de métodos de extensão. (Métodos estáticos podem ser nomeados livremente, e o compilador do C# gasta tempo buscando métodos, precisando verificar todos os classes estáticas no escopo do arquivo e escanear todos seus métodos estáticos para encontrar um correspondente)

  5. Múltiplas classes estáticas podem definir métodos de extensão idênticos.
    Ao estender um tipo com um método de extensão, também estende os tipos derivados.

Declaração de método de extensão

  • É necessário estar em uma classe estática não aninhada e não genérica (portanto, deve ser um método estático)

  • Pelo menos um parâmetro.

  • O primeiro parâmetro deve ter o prefixo this.

  • O primeiro parâmetro não pode ter outros modificadores (como ref ou out).

  • O tipo do primeiro parâmetro não pode ser um tipo de ponteiro.

Ponto a lembrar

  • Métodos de extensão são métodos personalizados que inicialmente não estão incluídos na classe.

  • Métodos de extensão podem ser adicionados a classes personalizadas, .NET Framework ou classes de terceiros, estruturas ou interfaces.

  • O primeiro parâmetro do método de extensão deve ser o tipo ao qual o método de extensão se aplica, seguido porthisPalavra-chave.

  • Você pode usar métodos de extensão em qualquer lugar do aplicativo, incluindo o espaço de nomes que contém o nome do método de extensão.