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.
Ação recomendada
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
- System.Diagnostics.Debug.Assert(Boolean, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String, Object[])
- System.Diagnostics.Debug.WriteIf(Boolean, String)
- System.Diagnostics.Debug.WriteIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteIf(Boolean, Object, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, Object, String)
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de