8

我一直在编写#if DEBUG, #else,#endif代码片段,我注意到 Visual Studio 不允许我使用自动完成功能来完成部分输入的成员名称,并且它不会检查灰色的非活动代码是否存在错误。我发现让它再次受到关注的唯一方法是将构建模式从调试切换到发布。但这很不方便,感觉好像有更好的方法。

例子:

#if DEBUG
    throw;
#else
    throw new exc // I want to use autocomplete here but can't because it's greyed out
#endif

如何让 VS 停止忽略其他配置范围内的其他代码#if DEBUG

4

3 回答 3

7

这是条件编译的目的,它按预期工作。使用条件编译应用程序可以在编译时忽略某些代码。您在 Visual Studio 中的应用程序在调试模式下运行,因此编译器会忽略#else部分内部代码。

在发布模式下运行您的应用程序,然后#else代码将可用但 #if DEBUG不可用。

在此处输入图像描述

更新


要同时检查两者#if DEBUG#else您需要运行应用程序两次。

1.一旦处于调试模式,其中代码#if DEBUG如下:

在此处输入图像描述 在此处输入图像描述

这里应用程序处于调试模式,因此#if DEBUG条件代码处于活动状态..

  1. 在发布模式下运行应用程序以检查代码是否符合#else条件。这里其他部分也可以使用自动完成和调试。

在此处输入图像描述 在此处输入图像描述


有关这方面的更多信息,请参阅 microsoft 文档:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/listed-by-category

于 2018-04-02T12:51:31.763 回答
4

我知道这是一个迟到的答案,但它仍然适用于今天。

TL;DR: this is a VS bug,它只影响 netstandard/netcore 项目(或者简单地说,新的 .csproj 格式)。

解决方法是......讨厌!Reload the project file(或关闭并重新打开VS)。

好消息:这不会影响编译 :)

你可以在这里这里阅读更多。

于 2019-03-06T18:52:14.000 回答
1

在文件的开头定义两个常量:

#define DEBUG
#define RELEASE

接下来,使用两个if条件而不是if/else.

#if DEBUG
            // autocomplete works
#endif
#if RELEASE
            // autocomplete works
#endif

当然,您必须在编译项目之前删除/注释掉这些定义。

在我看来,这既尴尬又充满错误。

于 2018-04-02T13:45:01.803 回答