哪个更有效: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()的性能是否足够重要,以至于在静态字段中保存类型是有益的?

哪个更有效:MyType . gettype()或typeof(MyType)

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();

甚至不会构建,因为你需要一个类的实例。

长话短说,它们在不同的上下文中做同样的工作。