代码之家  ›  专栏  ›  技术社区  ›  Marco Levarato

C 7.2传递函数参数的只读字段中引用的常量vs

  •  2
  • Marco Levarato  · 技术社区  · 6 年前

    假设我有一个班级: 警察

    private const decimal x = 2.0m;
    

    只读字段

    private readonly decimal y = 2.0m;
    

    具有此签名的方法

    void Method1(in decimal x)
    

    如果我使用const x method1(x)调用method1,我假设x的值将按值传递,而当我将method1与readonly y y method1(y)一起使用时,该值将通过readonly引用传递。所以我的期望是,只读字段的性能越高,它被用作“假”常量。我错了?我有一些疑问,编译器将在内部使用const,或者由clr优化const,将其作为引用传递的只读字段来执行。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Marco Levarato    6 年前

    class Test
    {
        public const decimal x = 0.2m;
        public readonly decimal y = 0.2m;
    
        public void Method1(in decimal x)
        {
            Thread.MemoryBarrier();
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var t = new Test();
    
            var sw = new Stopwatch();
            sw.Start();
            for (var i = 0; i < 100000000; i++)
            {
                t.Method1(in t.y);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            sw.Restart();
            for (var i = 0; i < 100000000; i++)
            {
                t.Method1(Test.x);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            Console.ReadLine();
         } 
    }
    

        2
  •  2
  •   InBetween    6 年前

    const

    • 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
      

    readonly