Evaluación condicional de cadenas en métodos de depuración

Es habitual usar cadenas interpoladas como mensajes de aserción, por ejemplo:

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

Pero en versiones anteriores, esto hace que se cree una cadena para el mensaje, incluido el resultado de formato, en cada llamada, incluso si la condición es true. Y el uso típico de las aserciones es que se trata de una condición que siempre debe ser verdadera.

En C# 10 se agrega compatibilidad para una mejor interpolación de cadenas, incluida la capacidad de seleccionar como destino "controladores" personalizados además de cadenas. En .NET 6, la clase Debug tiene nuevas sobrecargas de Assert, WriteIf y WriteLineIf que usan esta funcionalidad para evaluar condicionalmente los elementos de formato de cadena interpolada solo si el mensaje es necesario. El compilador de C# prefiere estas nuevas sobrecargas. Si los elementos de formato mutaban de estado y el programa se basaba en esas mutaciones para que fueran visibles aunque la aserción no se activara, podría observar una diferencia de comportamiento.

Comportamiento anterior

En el código siguiente, siempre se invocará r.ToString().

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

Comportamiento nuevo

En el código siguiente, nunca se invocará r.ToString(), porque el mensaje solo es necesario si la condición es false.

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

Versión introducida

6.0 RC 1

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad de orígenes.

Motivo del cambio

Este cambio se ha incorporado para mejorar el rendimiento.

Las cadenas interpoladas usadas con métodos Debug no deben mutar el estado compartido. (Estos métodos también son condicionales en la constante de compilación DEBUG). Si, por algún motivo, es fundamental mantener el comportamiento anterior, agregue una conversión (string) antes de la cadena interpolada. Esta conversión obliga al compilador a enlazarse a la sobrecarga existente y garantiza que la cadena siempre se materializa.

API afectadas