C#

29 nov, 2021

Como usar atributos em funções locais no C# 9.0

100 visualizações
Publicidade

C# 9 agora permite atributos em funções locais (bem como atributos de parâmetro de funções locais). 

Dessa forma atributos com um significado especificado quando aplicados a um método, seus parâmetros ou seus parâmetros de tipo terão o mesmo significado quando aplicados a uma função local, seus parâmetros ou seus parâmetros de tipo, respectivamente.

Uma função local pode se tornar condicional no mesmo sentido que um método condicional, decorando-a com um atributo [ConditionalAttribute]. Lembrando que uma função local condicional também deve ser estática.

Todas as restrições sobre métodos condicionais também se aplicam a funções locais condicionais, incluindo que o tipo de retorno deve ser nulo.

Para ilustrar isso, veremos um exemplo de como usar o atributo Conditional para realizar execuções de funções locais condicionais dependendo do ambiente em que estamos executando nosso programa.

Neste exemplo, veremos como executar uma função local em relação ao ambiente de execução.

Vamos considerar que estamos executando uma ação apenas no modo DEBUG, e para isso temos que executá-la com o pré-processador #if :

A seguir o código usando uma versão anterior ao C# 9.0 :

using System;
namespace Demo
{
    class Program
    {
        private static void Main(string[] args)
        {
            static void ExecutarOperacao()
            {
                Console.WriteLine("Executando a operação");
            }
#if DEBUG
    ExecutarOperacao();
#endif
        }
    }
}

Aqui não podemos usar o atributo [Conditional (“DEBUG”)]  pois estamos usando a versão do C# 8.0 que não suporta atributos em funções locais.

Agora vejamos o  código usando o C# 9.0 e o atributo [Conditional] aplicado à função local:

using System;
using System.Diagnostics;
namespace Demo
{
    class Program
    {
        private static void Main(string[] args)
        {
            [Conditional("DEBUG")]
            static void ExecutarOperacao()
            {
                Console.WriteLine("Executando a operação");
            }

            ExecutarOperacao();
        }
    }
}

Executando o código vamos constatar que a execução do método vai ser feita apenas no modo DEBUG.