Veuillez noter que cette question a trait à la performance uniquement. Permet de sauter des lignes directrices de conception, de la philosophie, de la compatibilité, de la portabilité et de tout ce qui n'est pas liée à la performance pure. Je vous remercie.
Maintenant à la question. J'ai toujours supposé que parce que le C# getters/setters sont vraiment des méthodes dans le déguisement de lecture publique de champ doit être plus rapide que d'appeler un getter.
Pour m'en assurer, j'ai fait un test (le code ci-dessous). Toutefois, ce test ne produit que des résultats attendus (c'est à dire les champs sont plus rapides que les méthodes de lecture à 34%) si vous l'exécutez à partir à l'intérieur de Visual Studio.
Une fois que vous l'exécutez à partir de la ligne de commande, il montre à peu près le même timing...
La seule explication pourrait être que le CLR ne supplémentaires d'optimisation (corrigez-moi si je me trompe ici).
Je ne crois pas que dans la vraie demande où ces propriétés sont utilisées dans beaucoup plus évoluée de la manière dont ils vont être optimisées de la même façon.
Merci de m'aider à prouver ou à réfuter l'idée que dans la vraie vie, les propriétés sont plus lents que les champs.
La question est de savoir comment dois - je modifier les classes de test pour faire le CLR changement de comportement de sorte que le champ public outperfroms les getters. OU me montrer que toute propriété sans logique interne effectuera le même comme un champ (au moins sur le getter)
EDIT: je ne parle que de Version version 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;
}
}