仅调试构造函数,而不在发布模式下编译

时间:2019-04-08 00:50:58

标签: c# debugging

有什么方法可以创建一个不在发布模式下编译的“仅调试”构造器?

到目前为止,我找到了两个解决方案:

  • 用#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){}
}

编辑

正如下面的Chen Chen和Erik Philips所指出的那样,这个问题是XY问题。 更广泛的情况是:我的主要构造函数从Internet上加载大量资源。但是我想使用加载伪值的快速加载构造函数进行调试,仅测试特定功能。我通过创建一个虚拟类而不是工作类的虚拟构造函数来解决它。对于这个问题可能有更好的解决方案。

所以,最重要的是:

  • 在构造器上没有类似于 ConditionalAttribute
  • 的属性
  • 您可以使用编译器指令#if DEBUG包围,以防止在发布模式下编译特定的构造函数/方法。您也可以将它们分组为局部类,以提高可读性。
  • 但是,如果您需要这样的构造函数,那么如果没有其他选择,请三思。

3 个答案:

答案 0 :(得分:0)

您遇到的问题比Conditional 属性

您不能拥有2个具有相同签名的构造器 ...无论如何(我确定这只是一个错字),让我们看看文档

Compiler Error CS0592

  

属性'attribute'在此声明类型上无效。它是   仅对“类型”声明有效。

     

定义属性时,定义它可以是什么构造   通过指定AttributeTargets值应用于。在下面的   例如,MyAttribute属性只能应用于接口,   因为AttributeUsage属性指定   AttributeTargets.Interface。产生错误的原因是   属性应用于一个类(A类)。

恰好发生ConditionalAttribute定义如下

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]

AttributeUsage (C#)

  

确定如何使用自定义属性类。   AttributeUsageAttribute是您应用于自定义属性的属性   定义。 AttributeUsage属性使您可以控制:

     
      
  • 可以应用哪个程序元素属性。除非您限制其用法,否则属性可以应用于以下任何程序元素:程序集,模块,字段,事件,方法,参数,属性,返回,类型
  •   
  • 一个属性是否可以多次应用于一个程序元素。
  •   
  • 属性是否被派生类继承。
  •   

因此,查看文档,您无法在构造函数上使用此 Attribute

但是,您可以使用编译器指令

#if (C# Reference)

  

当C#编译器遇到#if指令时,最终   通过#endif指令,它将编译指令之间的代码   仅在定义了指定符号的情况下。

public class Foo
{    
   public Foo() { }

#if DEBUG
   internal Foo2(Something something) { }
#endif
}

public class Foo
{
#if DEBUG
   public Foo() { }
#else
   public Foo() { }
#endif
}

答案 1 :(得分:0)

您可以尝试使用partial类。

基本上,您将类分为两个文件。一个用于常规实现,另一个用于仅调试实现,该实现包装在#if DEBUG编译器指令中。

// Foo.cs
public partial class Foo
{

   /// <summary>
   /// Main constructor
   /// </summary>
   public Foo(){}
}

// Foo.Debug.cs
public partial class Foo
{
  #if DEBUG

  /// <summary>
  /// Debug only constructor
  /// </summary>
  internal Foo(bool dummy){}

  #endif
}

这样,您可以组织所有不会在发布模式下编译到同一文件中的方法,成员等。

答案 2 :(得分:0)

这个要求对我来说似乎很奇怪。我认为,如果从一开始就进行解释,您会得到更好的答案,当前的问题更像是对原始要求的尝试解决方案。

要直接回答您的问题,我们可以在这里使用工厂。

public class Foo
{
    private Foo(){}
    private Foo(bool dummy){}

    public static Foo FromNormal() { }

#if DEBUG
    public static Foo FromDummy(bool dummy) { }
#endif
}
相关问题