我使用以下代码偶然发现了令人惊讶的编译器警告:
private const bool DEFAULT_SETTING = false;
//...
string aString = (DEFAULT_SETTING) ? "1" : "0";
Run Code Online (Sandbox Code Playgroud)
它会生成警告warning CS0429: Unreachable expression code detected.
在最初困惑之后,我意识到编译器没有错,因为值DEFAULT_SETTING是常量而且不能改变.因此,? "1"永远无法到达三元运算符的一部分.但编译器也不完全正确,因为我自己或未来的开发人员可能希望(或需要)在不破坏代码的情况下更改默认值.
有没有更好的方法来使用类似于上面的上下文的默认设置,不会产生警告?
注意:您可能想知道我为什么要转换false为"0"...它是保存到设置XML文件.当文件丢失时,软件会自动生成带有默认设置的闪亮的新XML文件.
Eri*_*ert 14
有没有更好的方法来使用类似于上面的上下文的默认设置,不会产生警告?
是.
但首先:立即停止使用SHOUTY_SNAKE_CASING.这让你看起来像是一名C程序员.C#使用camelCasing和PascalCasing.
现在回答你的问题.如果命名值可以更改,那么根据定义它不是常量.仅将常量用于永不改变的事物.Pi是一个常数.金原子中的质子数是常数.程序的名称不是常量,无论是调试还是零售构建都不是常量,依此类推.那些事情改变了.
编译器有权对您的代码发出警告,因为它似乎是根据永不改变的东西做出选择,因此可能是一个错误.
这不仅仅是一个惯例; C#语言的语义假设常量不会永远改变.举例来说,如果你有一个公共不断Foo在Foo.DLL,它是由代码Bar.EXE消耗掉,重新编译Foo.DLL用不同的值Foo并没有更新的值Foo自动Bar.EXE.C#编译器将假定Foo将永远不会改变,使得复制其在Bar.EXE价值.
为了表示这个概念"这个东西在我的程序中不会改变,但它可能会在我的程序的不同实例中发生变化"使用readonly:
private static readonly bool DefaultSetting = false;
...
string aString = DefaultSetting ? "1" : "0";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |