3

我经常对此感到困惑。我一直被教导用变量或常量来命名我经常使用的数字,但如果它降低了程序的效率,我还应该这样做吗?这是一个例子:

private int CenterText(Font font, PrintPageEventArgs e, string text)
    {
        int recieptCenter = 125;
        int stringLength = Convert.ToInt32(e.Graphics.MeasureString(text, font));
        return recieptCenter - stringLength / 2;
    }

上面的代码使用了命名变量,但运行速度比这段代码慢:

private int CenterText(Font font, PrintPageEventArgs e, string text)
    {
        return 125 - Convert.ToInt32(e.Graphics.MeasureString(text, font) / 2);
    }

在这个例子中,执行时间的差异很小,但是在更大的代码块中呢?

4

3 回答 3

9

当他们说“使用常量”时,他们的字面意思是“使用常量”;它们并不意味着“使用永不改变的变量”。

这相当于您的代码:

const int recieptCenter = 125;
int stringLength = Convert.ToInt32(e.Graphics.MeasureString(text, font));
return recieptCenter - stringLength / 2;

使用const关键字,编译器知道它125永远不会改变,并且将能够应用它将应用于以文字表示的常量的优化。

命名你的“神奇数字”有一个巨大的优势:在你离开公司后维护你的代码的人会知道125. 当您在几年后重新访问此代码时,它也会对您有所帮助。

于 2013-10-18T19:05:20.077 回答
9

使用变量和硬编码值之间的差异在最坏的情况下可以忽略不计。编译器可以很好地处理这样的事情。如果您看到性能差异,我想听听您收集这些指标的方法。(您的测试本身可能是可疑的,并且很可能是不可重复的。)

在任何情况下,您首先应该担心使您的程序正确和可维护。这意味着:

  • 仔细命名你的类、方法和变量
  • 分离关注点
  • 避免使用幻数和字符串(到底是125什么,它是什么意思?)
  • 避免编码
  • 等等

此外,receiptCenter 听起来也不应该是一个常数。它可能很少更改,但我建议您将其存储在应用程序之外的配置文件或数据库表等中。如果需要更改该值,则必须重新编译并将整个内容推送到 prod。另外,将您的软件发布到其他收据中心值不同的地方怎么样?您只想更改配置设置,而不是仅为该实例构建不同版本的应用程序。

优化是您最不担心的事情,除非这是您首先要担心的事情并且这是架构师/专家级别的考虑。

于 2013-10-18T19:03:00.207 回答
-1

收据中心应该是在该私有方法之外的某个地方声明的常量,在某个明显的地方,所有常量都一起声明。或者,它可以是从配置中读取的变量。

当您在类库深处的私有方法中的某处为常数命名时,它确实不会改进您的代码。

于 2013-10-18T19:06:47.457 回答