找出答案的唯一方法是测量。
“type1”变体在任何方面都不可靠或不推荐,因为并非所有类型都可以构造。更糟糕的是,它分配了需要作为垃圾收集器的内存并调用对象构造函数。
对于剩下的两个选项,在我的机器上,“type3”在调试和发布模式下的速度大约是“type1”的两倍。请记住,这仅适用于我的测试——结果可能不适用于其他处理器类型、机器类型、编译器或 .NET 版本。
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
var y = typeof(Program).ToString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
for (int i = 0; i < 10000000; i++)
{
var y = typeReference.ToString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
也就是说,在没有明确要求的情况下提出这个问题有点令人担忧。如果您注意到性能问题,您可能已经对其进行了分析并知道哪个选项更好。这告诉我这很可能是过早的优化——你知道这句话,“过早的优化是万恶之源”。
编程代码不仅仅通过性能来衡量。它还通过正确性、开发人员生产力和可维护性来衡量。没有充分理由增加代码的复杂性只是将成本转移到其他地方。对于现在和未来的应用程序维护者来说,本来可能不是问题的事情现在变成了生产力的严重损失。
我的建议是始终使用“type1”变体。我列出的测量代码不是真实世界的场景。将 typeof 缓存到引用变量可能会产生很多副作用,尤其是在 .NET 加载程序集的方式方面。与其只在需要时加载它们,不如在每次使用应用程序时最终都加载它们——将理论性能优化变成一个非常实际的性能问题。