gpt4 book ai didi

c# - typeof(T) 与 Object.GetType() 性能对比

转载 作者:IT王子 更新时间:2023-10-29 04:25:59 25 4
gpt4 key购买 nike

有没有人知道 typeof(T) where T : struct,例如,与 t.GetType() where t is a System.Object?
ILdasm 显示 typeof(T) 使用 System.Type::GetTypeFromHandle(RuntimeTypeHandle handle),而另一个只是普通的 System.Object::GetType()。实现是[MethodImpl(MethodImplOptions.InternalCall)],所以这些方法是在 CLR 的 native 代码中定义的。所以,我只是想知道是否有人知道有什么理由比另一个更喜欢一个?

编辑:让我澄清一下,我最感兴趣的是您选择哪个似乎无关紧要的情况 - 也就是说,是否存在性能差异或任何其他原因?谢谢!

最佳答案

typeof 用于获取表示特定类型的 Type 实例。 GetType 给出调用它的对象的运行时类型,它可能与声明的类型不同。

例如:

class A {}

class B : A {}

class Program
{
static A CreateA()
{
return new B();
}

static void Main()
{
A a = CreateA();
Console.WriteLine(typeof(A)); // Writes "A"
Console.WriteLine(a.GetType()); // Writes "B"
}
}

在上面的例子中,在 Main 方法中,您正在处理 A 类型的实例;因此,如果您关心声明的类型,您可以使用 typeof(A)。然而,CreateA 方法实际上返回派生类 B 的实例,尽管将基类声明为返回类型。如果您想了解此运行时类型,请对返回的实例调用 GetType

编辑:Mehrdad 的评论指向正确的方向。尽管 typeof 发出一个 GetTypeFromHandle 调用,该调用将 RuntimeTypeHandle 作为参数,但该参数实际上对应于元数据 token 位于评估堆栈。在某些情况下,此标记将隐式存在(由于当前方法调用);否则,可以通过调用 ldtoken 将其显式推送到那里.您可以在这些答案中看到更多这样的例子:

编辑2:如果你正在寻找性能基准,你可以引用Jon Skeet's answer .他的结果是(1 亿次迭代):

typeof(Test):   2756ms
test.GetType(): 3734ms

关于c# - typeof(T) 与 Object.GetType() 性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17495402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com