Compartilhar via


Avaliação condicional de strings em métodos Debug

É comum usar cadeias de caracteres interpoladas como mensagens de declaração, por exemplo:

Debug.Assert(result != x, $"Unexpected result {result}");

No entanto, em versões anteriores, isso faz com que uma cadeia de caracteres seja criada para a mensagem, incluindo o resultado da formatação, em cada chamada, mesmo que a condição seja true. E o uso típico de assertivas é que elas se referem a uma condição que sempre deve ser verdadeira.

O C# 10 adiciona suporte para interpolação aprimorada de cadeia de caracteres, incluindo a capacidade de direcionamento a "identificadores" personalizados além de cadeias de caracteres. No .NET 6, a Debug classe tem novas sobrecargas de Assert, WriteIfe WriteLineIf que utilizam essa funcionalidade para avaliar condicionalmente os itens de formatação de cadeia de caracteres interpolada somente se a mensagem for necessária. O compilador C# preferirá essas novas sobrecargas. Se os itens de formatação estivessem em estado de mutação e o programa dependesse que essas mutações ficassem visíveis mesmo quando a asserção não fosse disparada, você poderia observar uma diferença de comportamento.

Comportamento anterior

No código a seguir, r.ToString() sempre seria invocado.

Debug.Assert(true, $"{r.ToString()}");

Novo comportamento

No código a seguir, a chamada de r.ToString() jamais ocorrerá, pois a mensagem somente será necessária caso a condição de false seja atendida.

Debug.Assert(true, $"{r.ToString()}");

Versão introduzida

6.0 RC 1

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade da origem.

Motivo da alteração

Essa alteração foi introduzida para melhorar o desempenho.

Cadeias de caracteres interpoladas usadas com Debug métodos não devem alterar o estado compartilhado. (Esses métodos também são condicionais à constante de compilação DEBUG.) Se, por algum motivo, for essencial manter o comportamento antigo, adicione um cast (string) antes da cadeia de caracteres interpolada. Essa conversão força o compilador a se associar à sobrecarga existente e garante que a cadeia de caracteres seja sempre materializada.

APIs afetadas