调试属性如[DebuggerDisplay]是否仍会编译到发布的二进制文件中?

6

最近了解了DebuggerDisplay属性,发现它非常有用。然而,让我惊讶的是它没有附加[ConditionalAttribute("DEBUG")]属性。是否有一些方法可以强制使用该属性?或者尝试这样做是一个坏主意吗?或者由于其他原因,这并不重要?


当使用DebuggerDisplay属性时,如果我们没有将其包装在预处理器指令中,它是否仍会在发布模式下执行?换句话说,它在我的代码中的使用是否会减慢发布模式下的速度? - Ciaran Gallagher
4个回答

5

[ConditionalAttribute("DEBUG")]仅用于优化方法调用。

如果您真的想从构建中删除它们,可以使用#ifdef,以便代码仅在发布模式下编译。

需要记住的一件事是,只要有pdb文件,您仍然可以在发布模式下调试二进制文件。发布模式只是更快地清除变量并应用一些编译器优化。


更进一步,有没有办法找出这些.pdb文件中是否保存了这些信息?如果发布的“二进制”没有它们也没关系。 - MighMoS
它保存在dll文件中而不是pdb文件中。您可以使用诸如反编译器之类的工具来查找此信息。PDB文件(作为摘要)包含有关原始源代码、行号等详细信息。 - Matthew Steeples

4

由于我经常需要在没有 DEBUG 指令的 Release 配置构建中调试,因此我不希望这些对调试器的提示被删除。

但是,如果您在调试时显示的信息中有一些专有或机密信息,您可能希望考虑使用ConditionalAttribute#if/#elif/#endif 预处理指令来控制在发布版本中发出什么。

例如,您可以执行以下操作:

#if DEBUG
[DebuggerDisplay...]
#endif
public class MyAwesomeClass
{
}

这将确保只有在给出DEBUG指令时才会发出该属性。


2
我将分享我所喜爱的一种模式,该模式使用了 partial
public partial class MyClass{
    //class details here
}

And then elsewhere:

#if DEBUG
[DebuggerDisplay("DebuggerValue")]
public partial class MyClass{
    //anything needed for debugging purporses
}
#endif

这样可以使用DebuggerDisplay或其他属性,而不会使基类混乱。

我一直在使用一些文件,都包含在#if DEBUG中,来保存这些调试部分。这有助于保持核心类的清洁,并且我不必记住为每个属性开始/结束编译器指令。


0
我认为这是一个不好的想法,因为很多时候你附加属性的东西除了在调试器中显示之外还有其他用途。

我觉得你可能误解了。我想要编译出属性,而不是类。 - MighMoS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接