【发布时间】:2019-04-08 00:50:57
【问题描述】:
有没有办法创建一个不在发布模式下编译的“仅调试”构造函数?
目前我发现的两个解决方案是:
- 用#if DEBUG 包围构造函数。但是如果你有很多方法/构造函数,这可能会很麻烦
- 使用 ConditionalAttribute,但它不适用于构造函数,也不适用于返回除 void 之外的任何内容的方法
理想情况下,与 Conditional 相同但具有扩展范围的属性会很棒。
感谢您的帮助。
public class Foo
{
/// <summary>
/// Main constructor
/// </summary>
public Foo(){}
/// <summary>
/// Debug only constructor
/// </summary>
[Conditional("DEBUG")] //does not compile, wished behavior
internal Foo(bool dummy){}
}
编辑
正如下面 Cheng Chen 和 Erik Philips 所指出的,这个问题是一个 XY 问题。 更广泛的情况是:我的主要构造函数从 Internet 加载大量资源。但我想用一个加载虚拟值的快速加载构造函数进行调试,只测试特定的函数。我通过创建一个虚拟类而不是工作类的虚拟构造函数来解决它。这个问题可能有更好的解决方案。
所以,底线是:
- 在构造函数上没有类似 ConditionalAttribute 的属性
- 您可以使用编译器指令#if DEBUG 来防止在发布模式下编译特定的构造函数/方法。您也可以将它们分组到一个部分类中以获得更好的可读性。
- 但是,如果您需要这样的构造函数,如果没有其他选择,请三思。
【问题讨论】:
-
为什么你需要这个? This is an XY Problem,也就是说您认为这样做会解决一些其他问题,而不是询问如何解决该问题,而是希望我们通过您尝试的解决方案来解决问题。
-
好的,重点。底线:我需要一个快速加载的构造函数来进行调试,而我的常规构造函数需要大量资源。但我不希望这个构造函数在其他任何地方可用。内部可能就足够了
-
那么为什么你需要一个快速加载的构造函数(你仍然告诉我们你尝试的解决方案,而不是实际的问题)。您在做什么需要在调试期间使用不同的构造函数?
-
使用默认值而不是其实际值加载数据集(从互联网各地收集)