7

#define 指令在 C# 中的用途和良好用法是什么?

关于这个主题的问题已经很少,但我不需要答案。他们只举例说明它是如何工作的。但我需要更深入的解释:它为什么存在以及使用它的好方法是什么(如果有的话)。

基本上我知道如何使用它,但对我来说,用法看起来很奇怪。让我们看一个例子:

#define DEV

#if DEV
Console.WriteLine("Development trace log message");
#endif

对我来说,这与使用带有项目定义的条件编译符号的#if 条件构建完全不同。如果我们使用项目定义的符号,它会附加到项目构建配置,我们可以使用构建配置来管理构建所需的代码(并从构建中排除)。所以代码

#if DEBUG
Console.WriteLine("Debug log message");
#endif

对我来说很好。但正如我所说,它与使用#define 指令完全不同,因为它是可管理的。 我是否正确地认为第一个示例只能在每个构建中手动注释/取消注释 #define 行?如果是,它是不可管理的,难以维护的,我认为#define 的这种用法是非常糟糕的做法,并且在语言中根本不存在。

我可以想象在#if 语句中使用#define/#undef。就像是

#if DEBUG
#if CLIENT1
#define TEST_CLIENT1
#endif
#endif

#if TEST_CLIENT1
connectionString = "Some specific test connection" //I know this is bad practice even in conditional. Only for example purpose.
#elif
//Read connection from config
#endif

#if UNITTESTS
#undef TEST_CLIENT1
#endif

#if TEST_CLIENT1
Console.WriteLine("Some message");
#endif

对不起,这么复杂的例子,但这至少是我觉得有用的东西。虽然我不会以任何方式编写这样的代码 =)。 #define 有什么好的用法吗?

PS:我已经有 5 年没有使用过#define 自己了,也没有意愿这样做,但是我得到了一个支持项目,其中有许多奇怪的定义,甚至以奇怪的方式命名。这些定义通常放在文件的顶部,就像我在这里的第一个例子一样。而且我不知道如何维护这段代码。

4

2 回答 2

3

除了没有它,我看不到任何正当理由,该#IF声明将不存在。

当您使用/define编译器上的指令定义项目级前置条件变量时,它实际上所做的只是将 a 添加#DEFINE到代码中。

我认为这使它易于管理,但不能使用/define语句在代码中手动设置它。

另一个用处是可读性和范围。项目定义语句适用于项目,#DEFINE级别语句仅适用于一个文件。这有助于保持事物的组织性、可读性并阻止可变问题。

于 2012-07-27T09:58:46.683 回答
1

'#define' 存在是因为人们期望它存在。:) 出于您的目的(例如大型项目),在项目中保留预处理器符号可能更有意义。对于快速调试或其他目的,#define 可能是最佳选择。此外,#define 允许对符号进行细粒度(文件级别)控制。

想象一下,您有一个庞大的代码库和一个给您带来麻烦的模块。出于性能原因,您可能希望仅在要启用跟踪/调试的单个文件中使用“#define TRACE”或“#define DEBUG”。

于 2012-07-27T09:57:35.430 回答