BT

Início Notícias C# 8: Atributo de expressão de chamada para Asserções e Testes Automatizados

C# 8: Atributo de expressão de chamada para Asserções e Testes Automatizados

Favoritos

O C# e outras linguagens .NET, apresentam um conceito conhecido como atributos de informações de chamada. Quando um desses atributos é usado em um parâmetro, o desenvolvedor não é responsável por fornecer o argumento correspondente: o compilador faz isso automaticamente. Atualmente, o C# suporta os atributos de informações de chamada para o nome/caminho do arquivo, o número da linha e o nome do método/propriedade de chamada. Com a nova proposta dos atributos de expressão de chamada, as expressões seriam adicionadas a essa lista; ou seja seria possível que desenvolvedores capturassem a expressões passadas a um método.,

Como exemplo, considere esses dois Asserts:

Assert.IsTrue(x - 7 > 0);
Assert.IsTrue(y - 3 > 0);

Se o teste falhar, fica difícil determinar qual dos Asserts foi acionado. Poderia ser incluída uma mensagem para cada Assert, mas isso seria entediante e correria o risco de ficar desatualizado. O que seria mesmo útil é se a expressão em si fosse capturada:

public static void IsTrue(bool condition, [CallerArgumentExpression("condition")] string message = null);

Neste exemplo, se o desenvolvedor não fornecer explicitamente uma mensagem, o compilador insere o código usado no argumento de condição. Essencialmente, o compilador transforma o código para que fique assim:

Assert.IsTrue(x - 7 > 0, "x - 7 > 0");
Assert.IsTrue(y - 3 > 0, "y - 3 > 0");

Dentro do design proposto, esse mecanismo de captura funcionaria até mesmo com métodos de extensão.

Problemas Potenciais

Três problemas foram citados com essa proposta:

Se um valor nulo ou uma string que não seja nome de parâmetro for fornecido, o compilador passará uma string vazia. Com um descompilador seria possível ver os códigos-fonte nos locais de chamada para os métodos marcados com o atributo. Isso pode ser visto como indesejável ou não-esperado para softwares proprietários.

Embora não seja uma falha da nova funcionalidade em si, uma fonte de preocupação pode ser a existência de uma API Debug.Assert, que hoje recebe apenas um bool. Mesmo que a sobrecarga recebendo uma mensagem tenha seu segundo parâmetro marcado com esse atributo e tornado opcional, o compilador ainda escolheria a opção sem mensagem ao fazer a resolução da sobrecarga. Portanto, a sobrecarga sem mensagem teria que ser removida para aproveitar a nova funcionalidade, significando uma alteração que levaria à quebra de binários (embora não de códigos-fonte).

Status

Atualmente, a proposta de atributos de expressão de chamada está listada no roadmap do C# com o status "Protótipo".

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

BT

Seu cadastro no InfoQ está atualizado? Poderia rever suas informações?

Nota: se você alterar seu email, receberá uma mensagem de confirmação

Nome da empresa:
Cargo/papel na empresa:
Tamanho da empresa:
País:
Estado:
Você vai receber um email para validação do novo endereço. Esta janela pop-up fechará em instantes.