Ear*_*rlz 32 c# compiler-warnings
我的应用程序中有一些配置选项
const bool ExecuteThis=true;
const bool ExecuteThat=false;
Run Code Online (Sandbox Code Playgroud)
然后像使用它的代码
if(ExecuteThis){ DoThis(); }
if(ExecuteThat){ DoThat(); } //unreachable code warning here
Run Code Online (Sandbox Code Playgroud)
问题是,我们可能会制作略有不同的版本,而不是ExecuteThis或ExecuteThat,我们希望能够使用consts,这样我们就不会在运行时对这些事情进行任何速度惩罚.但我厌倦了看到关于无法访问的代码的警告.我是一个喜欢消除所有警告的人,但我对这些事情无能为力.我可以使用一些选项来关闭这些警告吗?
jas*_*son 55
要禁用:
#pragma warning disable 0162
Run Code Online (Sandbox Code Playgroud)
恢复:
#pragma warning restore 0162
Run Code Online (Sandbox Code Playgroud)
有关详细信息#pragma warning,请参阅MSDN.
请注意,C#编译器已经过优化,不会发出无法访问的代码.这称为死代码消除,它是C#编译器执行的少数优化之一.
而你不应该无所事事地禁用警告.警告是问题的症状.请看这个答案.
ang*_*son 24
首先,我同意你的意见,你需要摆脱所有的警告.你得到的每一个小警告,通过解决问题摆脱它.
在继续阅读之前,重新阅读的内容相当于咆哮,让我强调使用这样的代码似乎没有任何性能损失.使用Reflector检查代码后,看起来被"标记"为无法访问的代码实际上并未放入输出程序集中.
但是,它由编译器检查.仅凭这一点可能是我无视我的咆哮的充分理由.
换句话说,摆脱那个警告的净效果只是,你摆脱了警告.
另请注意,这个答案是一个意见.您可能不同意我的意见,并希望用来#pragma掩盖警告信息,但至少对这是做什么有明智的意见.如果你这样做,谁在乎我的想法.
话虽如此,为什么要编写无法访问的代码?
你使用的是consts而不是"define"吗?
警告不是错误.对你来说,分析这段代码并弄清楚你是否做对了.通常,你没有.对于您的特定示例,您有意编译代码,对于您的特定配置,该代码永远不会执行.
为什么代码甚至存在?它永远不会执行.
您是否对"常数"这个词实际意味着什么感到困惑?一个常数意味着"这永远不会改变,如果你认为它会,它不会是一个常数".这就是常数.它不会,也不会,也不应该改变.永远.
编译器知道这一点,并告诉你你有代码,由于常量,永远不会执行.这通常是一个错误.
这种情况会不会改变?如果是,它显然不是常量,而是取决于输出类型(Debug,Release),它是"#define"类型的东西,所以删除它,然后使用该机制.这使得阅读代码的人更清楚这个特定代码所依赖的内容.如果您选择了未设置定义的输出模式,Visual Studio也将有助于使代码变灰,因此代码将无法编译.这就是编译器定义要处理的内容.
另一方面,如果常量不会改变,无论出于何种原因,删除代码,您都不会需要它.
在任何情况下,不要成为简单的解决方案的牺牲品,只是禁用该代码的警告,这就像服用阿司匹林"修复"你的背部疼痛问题.这是一个短期的解决方案,但它掩盖了这个问题.而是修复潜在的问题.
为了完成这个答案,我想知道你的问题是否没有完全不同的解决方案.
通常,当我看到具有"检测到无法访问的代码"警告的代码时,它们属于以下类别之一:
const与编译器的使用#define,你基本上对编译器说:"这段代码,请编译它,即使我知道它不会被使用."如果您拥有的代码不属于上述任何设置,那么您的常量会发生变化的具体情况是什么?知道这可能会给我们更好的方法来回答你如何处理它的问题.
Jas*_*own 22
那么使用预处理器语句呢?
#if ExecuteThis
DoThis();
#endif
#if ExecuteThat
DoThat();
#endif
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 11
嗯,#pragma但这是一个但又蹩脚的.我想知道是否ConditionalAttribute会更好 - 即
[Conditional("SOME_KEY")]
void DoThis() {...}
[Conditional("SOME_OTHER_KEY")]
void DoThis() {...}
Run Code Online (Sandbox Code Playgroud)
现在要求到DoThis/ DoThat如果只包括SOME_KEY或SOME_OTHER_KEY定义为在构建符号("条件编译符号").它还意味着您可以通过更改配置并在每个配置中定义不同的符号来在它们之间切换.
| 归档时间: |
|
| 查看次数: |
8295 次 |
| 最近记录: |