如何在 C# 中使用 If DEBUG 语句而没有 IDE 认为代码无法访问?

Posted

技术标签:

【中文标题】如何在 C# 中使用 If DEBUG 语句而没有 IDE 认为代码无法访问?【英文标题】:How do I use an If DEBUG statement in C# without the IDE thinking code is unreachable? 【发布时间】:2011-02-25 01:27:26 【问题描述】:

我有一些代码需要在调试和发布模式下略有不同。它有一个名为PrettyPrint 的常量,在某些模式下设置为true,在其他模式下设置为false,我有时会更改它们。

#if DEBUG
        public const bool PrettyPrint = true;
#else
        public const bool PrettyPrint = false;
#endif

// ...snip...
string start, end, comma, innerIndentation;
if (Printer.PrettyPrint) 
    innerIndentation = indentation + "  ";
    start = "[\n";
    end = indentation + "]";
    comma = ",\n" + innerIndentation;
 else 
    innerIndentation = "";
    start = "[";
    end = "]";
    comma = ",";

// Then do some prints using the initialized strings as constants

这很好用,编译器足够聪明,可以优化if。但是,我收到了一个烦人的警告:

warning CS0162: Unreachable code detected

有没有办法在不执行以下任何操作的情况下避免此警告:

直接在代码中使用#if - 因为它使那部分代码非常难看,我想尽可能避免#ifs。 在其他情况下禁止 CS0162 - 因为我发现该警告对于查找损坏的代码非常有用。

我如何使用#if DEBUG 语句而不让 IDE 相信后面的所有代码都无法访问?

【问题讨论】:

const 替换为 readonly 编译器是不是被骗了?我没有看到任何无法访问的代码 @Nicklammort,编译器注意到Printer.PrettyPrintconst,因此永远不会改变。即if 语句将始终评估为true,这意味着else 部分将无法访问(反之亦然,当不处于调试模式时) @Nicklamor: DEBUG 在编译时设置。因此,对于给定的编译,PrettyPrint 将始终为真或始终为假。 “执行之间”是什么意思?无论您运行代码多少次,该常量将始终为真或始终为假,直到使用不同的 DEBUG 标志重新编译代码。无论哪种方式,其中一个代码块都无法访问,编译器警告您这是完全合适的。 【参考方案1】:

虽然我目前不知道如何将其应用到您的代码中,但您可能会发现 ConditionalAttribute 很有帮助。您可以使用预处理器指令,但您可能需要重新编写代码。

【讨论】:

【参考方案2】:

您可以执行以下操作来绕过它。

Printer.PrettyPrint.Equals(true)

【讨论】:

【参考方案3】:

你可以试试:

innerIndentation = Printer.PrettyPrint ? indentation + " " : "";

start = Printer.PrettyPrint ? "[\n" : "[";

end = Printer.PrettyPrint ? indentation + "]" : "]";

comma = Printer.PrettyPrint ? ",\n" + innerIndentation : ",";

但如果是我,我只会使用#if #else

【讨论】:

这实际上工作得很好,而且我仍然得到编译器优化,所以我决定走这条路。【参考方案4】:

您可以将PrettyPrint 更改为普通字段而不是const。 您将失去编译器优化,但这没关系。

我很确定你也可以在没有收到警告的情况下做到readonly;试试看。

【讨论】:

【参考方案5】:

将 PrettyPrint 从 const 更改为字段。

#if DEBUG          
    public bool PrettyPrint = true;  
#else 
    public bool PrettyPrint = false;  
#endif

【讨论】:

以上是关于如何在 C# 中使用 If DEBUG 语句而没有 IDE 认为代码无法访问?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Win 7 Visual Studio 2012 的 C# 中禁用#if DEBUG

C#有没有DEBUG调试输出的语句提供输出变量值?

如何在 C# if 语句中使用 Discord 表情符号

在 C# 中使用带有多个 if 语句的 else

#if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?

C# 测试代码#if DEBUG使用