【问题标题】:Are repeated if-statement constants "reused"? C# .NET重复的 if 语句常量是否“重用”? C# .NET
【发布时间】:2017-06-13 20:39:01
【问题描述】:

这是一个简单的问题,我不敢相信在此之前我没有想过阅读它......但我似乎无法找到正确的搜索词来找到答案,所以请多多包涵:

如果我有 60 条不同的 if 语句,请在整个班级中分布在多个方法中,如下所示:

if(myVar == 0.0f)
    yaddayadda

if(myOtherVar == 0.0f)
    yaddayadda

if(someVar == 0.0f || someOtherVar == 0.0f)
    yaddayadda

...那些 0.0f 是否被放入内存并随后被 GC'ed,每次使用它们时?还是它们存储在编译后的代码中?我最好定义如下内容:

const float zero = 0.0f;

...并使用它来代替?如果是这样,从 const 获取值在 CPU 周期方面是否比直接将常量留在 if 语句中更昂贵?

我问,因为我可以看到 decimal 实际上有一个 decimal.Zero 常量,但 float 和 double 都没有。

【问题讨论】:

  • 数字不存储在堆中。
  • 没有为那些 if 检查分配内存,这只是一个比较。顺便说一句,用 0.0f (或任何确切的值,真的)检查相等性是不好的。浮点数不是很准确,因此最好检查您的变量是否低于某个阈值。
  • @SLaks 这个问题从不使用“堆”这个词。
  • 过早的优化是万恶之源。在您对 GC 的工作原理和分析器有更深入的了解之前,不要担心
  • @gilliduck:只有当它们具有可能需要更改的相同语义值(而不是零)时,这才是正确的。

标签: c# if-statement unity3d constants


【解决方案1】:

这没有任何区别。编译后的版本是一样的。

看看design guidlines

编译器将 const 字段的值直接烧成调用 代码。因此,永远不能更改 const 值而不存在以下风险 破坏兼容性。

【讨论】:

  • 所以,我应该只为经常检查/使用的常量创建一个 const 字段,如果该常量的值可能会在构建之间发生变化,并且我希望能够做出这样的通过仅更改一处的值来更改 const 字段。知道了。谢谢。
  • @UltromantheTacoman 只要 const 是 internal 可见。 Public visible const 永远不应该改变,因为,您需要重建整个依赖项(因为对 const 的调用直接被文字内联替换)。
  • 这是一个很好的观点!如果适用,我会记得将我的 const 设为内部。
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2013-04-05
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多