条件方法 (Debug.Assert(...)) 的参数是否在发布模式下优化掉了?

Are parameters of conditional methods (Debug.Assert(...)) optimized away in release mode?

我经常在 Debug.Assert() 中嵌入昂贵的 linq 查询。

例如:Debug.Assert(!orderShipmentStatusLogs.GroupBy(c => new { c.Id, c.StartDateTime }).Any(c => c.Count() > 1));

在这种情况下,orderShipmentStatusLogs 可能是一个巨大的列表 - 因此这段代码可能很慢。

为了性能我问自己这是否聪明,我知道 Debug.Assert() 方法在发布模式下被删除,但是通过阅读文档:

Any arguments passed to the method or attribute are still type-checked by the compiler. https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.conditionalattribute?view=net-6.0

有点怀疑

那么我在这里安全吗,还是我通过添加大量断言不小心减慢了我的应用程序? Debug.Assert() 的参数是否优化掉了?

当您在发布模式下构建时,整个 Debug.Assert 行都被优化掉了。所以:

Console.WriteLine("Before");
Debug.Assert(false);
Console.WriteLine("After");

变为:

Console.WriteLine("Before");
Console.WriteLine("After");

您可以使用 SharpLab 查看此内容。在 Debug mode the Assert is still there but in Release 它消失了。