Compartilhar via


Avaliação de cadeia de caracteres condicional em métodos de depuração

É comum usar cadeias de caracteres interpoladas como mensagens de asserçã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 das asserções é que elas tratem de uma condição que seja sempre 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 classe Debug tem as novas sobrecargas Assert, WriteIf e WriteLineIf que utilizam essa funcionalidade para avaliar condicionalmente os itens de formatação de cadeia de caracteres interpolada somente quando a mensagem é necessária. O compilador C# prefere 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, r.ToString() nunca será invocado, pois a mensagem só será necessária se a condição for false.

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

Versão introduzida

6.0 RC 1

Tipo de alteração interruptiva

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

Motivo da alteração

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

As cadeias de caracteres interpoladas usadas com métodos Debug não devem alterar o estado compartilhado. (Esses métodos também são condicionais na constante de compilação DEBUG). Se, por algum motivo, for essencial manter o comportamento antigo, adicione uma conversão (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