在C#中使用#if debug指令是否可以?

LJM*_*LJM 2 c# testability

我们有一个类,类似于以下内容:

public class Processor
{
    //set timeout in seconds
    private const int TIMEOUT = 600;

    public void Process()
    {
        //DO SOMETHING HERE

        //CHECK TO SEE IF TIMEOUT HAS BEEN HIT
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我们想编写单元测试,以查看在指定的时间后是否发生超时.显然,我们不希望每次运行测试时都要等待10分钟.考虑到这一点,我的问题是:

我们如何管理这个值,使其在测试期间可能是10秒,但在生产中可能需要10分钟?有很多明显的方法可以做到这一点,但我正在努力确定最干净的方式.我们应该将其作为财产公开吗?包含它作为构造函数参数?将其作为方法参数包含在内?使用编译器指令?

Noo*_*ilk 8

对于您的确切场景,我可能有一个appSettings变量,用于确定适当服务器的超时(dev/whatever).

但一般来说,#if DEBUG在适当的时候使用该指令是非常合适的.但一般情况下,只有在实际上想要在发布模式下阻止编译其中的给定代码时才会使用它.

使用这样一个指令的一个经典理由,至少在我发现时,就是在发布代码中停止记录所包含的语句.另一种情况是,您可能在所有项目中包含某个通用库,但其中的某些代码与您正在部署的给定平台无关(即Compact Framework没有X类,因此您使用该指令来确定CF模式,并相应地编写代码).

  • 这都是不同的.如果每个实例都有一个新的/可能不同的变量是有意义的,那么你使用一个构造函数变量.如果在创建实例后更改它是有意义的,则使用settable属性,如果在每个版本中使用appSettings是有意义的,则使用appSettings.使用指令,*only*使用它的原因是用于删除编译.并且要小心它们的存在(正如米奇所描述的那样).我非常谨慎地使用它们.说实话,在我的个人项目中,我几乎从不使用它们.在我们的商业资料中,它如上所述(CF,Silverlight,Web差异). (2认同)