llc*_*lcf 24 .net c# c-preprocessor preprocessor-directive
我认为这是一个简单的问题所以我认为我错过了一些明显的东西.我真的没有使用预处理器指令,但我正在查看某人的代码,并且认为这是我应该熟悉的东西.
所以我看了msdn示例,它有代码:
#define DEBUG
// ...
#if DEBUG
Console.WriteLine("Debug version");
#endif
Run Code Online (Sandbox Code Playgroud)
我的两个问题是:
#define MYTEST然后写入控制台的示例,具体取决于它是否"已定义",但这与仅使用变量有何不同?我在这里错过了什么?Shi*_*mar 17
我实际上建议使用条件属性而不是内联#if语句.
[Conditional("DEBUG")]
private void DeleteTempProcessFiles()
{
}
Run Code Online (Sandbox Code Playgroud)
这不仅更清晰,更容易阅读,因为您的代码中最终没有#if,#else.在正常的代码编辑期间以及逻辑流错误中,此样式不易出错.
通常,构造脚本将提供可选/条件编译符号.很少看到#define,除了非常调试代码(如果你明白我的意思).
重新使用变量; 我经常使用这样的条件来处理必须在不同运行时运行的代码(单声道,cf,silverlight等).变量不能满足要求,因为代码无法针对错误的平台进行编译(缺少类型/方法等).
在提供的示例中,我可能只是使用过Debug.WriteLine; 因为它是装饰的[Conditional("DEBUG")],如果DEBUG未在构建时定义,则会自动删除对它的所有调用.
在上面的例子中,为什么他们定义DEBUG?如果你在debug v.发布模式下编译,我的印象是设置的吗?
可能是因为它是示例代码.它旨在展示#ifdef朋友的工作方式.我不希望你在源文件中定义这样的符号,除非它是用于快速测试.
查看具有"#define MYTEST"的另一个示例,然后根据它是否"已定义"写入控制台,但这与仅使用变量有何不同?我在这里错过了什么?
如果在编译时未定义MYTEST,则编译器实际上不会在#if和#endif块之间发出代码.因此,所得的IL将更小.
另请注意,这些不是 C#中的预处理程序指令.
| 归档时间: |
|
| 查看次数: |
12403 次 |
| 最近记录: |