【发布时间】:2019-01-09 00:21:29
【问题描述】:
假设我有一堂课: 一个常量
private const decimal x = 2.0m;
只读字段
private readonly decimal y = 2.0m;
具有此签名的方法
void Method1(in decimal x)
如果我使用 const x Method1(x) 调用 Method1,我假设 x 的值将按值传递,而不是当我将 Method1 与只读 y Method1(in y) 一起使用时,值将通过只读引用传递.所以我的期望是性能更高的是用作“假”常量的只读字段。我错了?我有一些疑问,编译器将在内部使用 const 或由 clr 优化,以作为通过引用传递的只读字段的性能。
【问题讨论】:
-
“性能更高” 为什么不简单地测量一下呢?但是做一个基准测试,这是在循环中执行数百万次。只做一次不会显示出现实的结果。无论如何,我认为差异 - 如果有的话 - 可以忽略不计。
-
这些语句不等效。一个 const 将在编译期间消失。编译器可以并且将用它的实际值替换对它的任何引用。事实上,这是其中一个问题 - 如果 any 程序集依赖于该常量,则 all 将不得不重新编译它们或最终使用不同的值。
Constant应该永远保持不变 -
@PanagiotisKanavos 实际上,如果您实际反编译上述情况,您会发现使用 in 关键字会有所作为。所以它只是消失了,但看看:sharplab
-
@RobinB 该副本是使用
in和ref的著名陷阱之一。不是in在此处创建副本。 编译器 不确定该值不会改变,因此它复制 以确保它不会改变。至少有一台 Roslyn 分析仪可以查找此类问题 -
@RobinB 找到它:ErrorProne.NET