gpt4 book ai didi

C# 7.2 函数参数传递中的 const 与 referenced(in) 只读字段

转载 作者:行者123 更新时间:2023-11-30 20:25:30 31 4
gpt4 key购买 nike

假设我有一个类:一个常量

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 版本实际上会在每次调用该方法时运行十进制构造函数,而 readonly/in 版本只会复制对先前创建的十进制实例的引用。后者显然更快。

您可以通过简单地检查 IL 来验证这一点:

  • 常量版本:

    IL_0001: ldc.i4.s 20
    IL_0003: ldc.i4.0
    IL_0004: ldc.i4.0
    IL_0005: ldc.i4.0
    IL_0006: ldc.i4.1
    IL_0007: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8)
    IL_000c: call instance bool C::Method2(valuetype [mscorlib]System.Decimal)
  • 只读/输入版本:

    IL_0002: ldflda valuetype [mscorlib]System.Decimal C::dd
    IL_0007: call instance bool C::Method1(valuetype [mscorlib]System.Decimal&)
    IL_000c: pop

也就是说,我不太确定为什么将 const 与性能联系起来。 const 是一种在代码中传达给定值永远不会改变的方式。 const并不意味着,这个存储为常量的值在使用时会具有更高的性能。

除非您确实有一个通过这种边际(最多)优化解决的经验证明的性能问题,否则逻辑上是常量的值应该是 const,并且逻辑上是变量只读值应该是readonly并且所有其他考虑因素都应该被忽略。如果您的情况是前者,请在代码中清楚地记录为什么逻辑常量值被实现为只读字段。

关于C# 7.2 函数参数传递中的 const 与 referenced(in) 只读字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51633114/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com