请注意这个问题只与性能有关。让我们跳过设计原则、哲学、兼容性、可移植性和任何与纯性能无关的东西。谢谢你。
现在回到问题。我总是假设,因为 C # getters/setter 实际上是伪装的方法,所以读取 public 字段必须比调用 getter 更快。
因此,为了确保我做了一个测试(下面的代码)。但是这个测试只能产生预期的结果(即 字段的速度比吸气剂的速度快,达到34% ) 如果,您可以在 VisualStudio 中运行它。
一旦您从命令行运行它,它会显示几乎相同的时间..。
唯一的解释可能是 CLR 做了额外的优化(如果我这里错了请纠正我)。
我不相信,在实际应用中,这些属性被用在更复杂的方式,他们将以同样的方式优化。
请帮助我证明或反驳在现实生活中属性比字段慢的观点。
问题是——我应该如何修改测试类以使 CLR 更改行为,从而使公共字段的性能优于 getter。OR 告诉我,任何没有内部逻辑的属性将执行与字段相同的操作(至少在 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;
}
}