请注意此问题仅与性能有关。让我们跳过设计准则,理念,兼容性,可移植性以及与纯性能无关的任何内容。谢谢。
现在到问题。我一直以为,因为C#的getter / setters实际上是伪装的方法,所以读取公共字段必须比调用getter更快。
因此,请确保我进行了测试(下面的代码)。但是,如果从Visual Studio内部运行此测试,则只能产生预期的结果(即,字段比getter的速度快34%)。
从命令行运行后,它将显示几乎相同的时间...
唯一的解释可能是CLR进行了其他优化(如果我在这里错了,请纠正我)。
我不认为在实际应用中以更复杂的方式使用这些属性时,它们将以相同的方式进行优化。
请帮助我证明或否定现实生活中的属性比字段慢的想法。
问题是-我应该如何修改测试类以使CLR更改行为,以便公共领域优于吸气剂。或告诉我,任何没有内部逻辑的属性都将与字段表现相同(至少在getter上)
编辑:我只在谈论发布x64版本。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PropertyVsField
{
class Program
{
static int LEN = 20000000;
static void Main(string[] args)
{
List<A> a = new List<A>(LEN);
List<B> b = new List<B>(LEN);
Random r = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < LEN; i++)
{
double p = r.NextDouble();
a.Add(new A() { P = p });
b.Add(new B() { P = p });
}
Stopwatch sw = new Stopwatch();
double d = 0.0;
sw.Restart();
for (int i = 0; i < LEN; i++)
{
d += a[i].P;
}
sw.Stop();
Console.WriteLine("auto getter. {0}. {1}.", sw.ElapsedTicks, d);
sw.Restart();
for (int i = 0; i < LEN; i++)
{
d += b[i].P;
}
sw.Stop();
Console.WriteLine(" field. {0}. {1}.", sw.ElapsedTicks, d);
Console.ReadLine();
}
}
class A
{
public double P { get; set; }
}
class B
{
public double P;
}
}