哪个更有效:MyType . gettype()或typeof(MyType)
本文关键字:MyType typeof gettype 有效 | 更新日期: 2023-09-27 18:15:08
假设我有一个类MyType
:
sealed class MyType
{
static Type typeReference = typeof(MyType);
//...
}
给定以下代码:
var instance = new MyType();
var type1 = instance.GetType();
var type2 = typeof(MyType);
var type3 = typeReference;
哪一个变量赋值是最有效的?
GetType()或typeof()的性能是否足够重要,以至于在静态字段中保存类型是有益的?
typeof(SomeType)
是一个简单的元数据令牌查找
GetType()
为虚呼;在正方,如果它是一个子类,你将得到派生类型,但在负方,如果它是一个子类,你将得到派生类。如果你明白我的意思。另外,GetType()
要求对结构体进行装箱,对于可空结构体不能很好地工作。
如果在编译时知道类型,则使用typeof()
。
我选type2。它不需要实例化实例来获取类型。这是最容易读懂的。
唯一的方法就是测量。
"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加载程序集的方式方面。与其只在需要时加载它们,不如在每次使用应用程序时都加载它们——将理论上的性能优化变成一个非常实际的性能问题。
它们很不一样。
typeof(MyType)
获得一个Type
对象,该对象描述使用ldtoken
指令在编译类型中解析的MyType
类型。
myInstance.GetType()
获取描述myInstance
变量运行时类型的Type
对象。
两者用于不同的场景。
你不能使用typeof(MyType)
,除非你在编译时知道它的类型并且可以访问它。
你不能使用myInstance.GetType()
,除非你有该类型的实例。
typeof(MyType)
总是更有效,但如果在编译时看不到该类型,则不能使用。您不能使用typeof(MyType)
来了解某些变量的实际运行时类型,因为您不知道该类型
两者基本相同。尽管typeof可以用于非实例类,如
typeof(MyClass);
,
MyClass.GetType();
甚至不会构建,因为你需要一个类的实例。
长话短说,它们在不同的上下文中做同样的工作。