Dan*_*Tao 6 .net vb.net reflection performance gettype
出于记录目的,我们的应用程序中的一些方法包括以下行:
Dim Log As ILog = GetLog(Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Run Code Online (Sandbox Code Playgroud)
我有可能被描述为对反思的非理性恐惧,我试图控制它.但是,在每秒执行一百次的方法中,这样的调用会引起我的注意.我不太了解反思; 但是从简要介绍文档来看,我认为我可以用以下内容替换以下内容:
Dim Log As ILog = GetLog(Me.GetType())
Run Code Online (Sandbox Code Playgroud)
我的问题有三方面:
Me.GetType()实际上返回相同Type的GetCurrentMethod().DeclaringType?Me.GetType()实际上做任何事情不同的GetCurrentMethod().DeclaringType,或者是做引擎盖下是一回事吗?Jar*_*Par 14
这取决于.Me.GetType将始终返回对象的实际类型.GetCurrentMethod().DeclaringType将返回声明方法的类型.这些值在继承方案中可能不同.
考虑以下
Class C1
Public Sub Foo()
..
End Sub
End Class
Class C2
Inherits C1
..
End Class
Run Code Online (Sandbox Code Playgroud)
在内部方法Foo中,如果您正在处理C1的实例,则两个表达式将相等.但如果它是C2,它们将是不同的.
是的,这些是非常不同的功能.Me.GetType确定类的当前实例的运行时类型.GetCurrentMethod.DeclaringType确定此方法声明的类型.
如果这是一个性能关键的场景,那么您确定要分析您不理解的API.特别是那些似乎涉及反思的人.但只有剖析器会告诉你哪个明确更快.我的钱在Me.GetType上.
在你的情况下有关两个调用将返回不同类型的情况,请参阅JaredPar的答案.this.GetType()将产生与之相同的结果MethodBase.GetCurrentMethod().DeclaringType.
在一般情况下,暴露成员(通过MemberInfo.ReflectedType属性获得)的类型和声明成员(通过MemberInfo.DeclaringType属性获得)的类型可能不同.
UPDATE
我只是用C#异形它- this.GetType()需要2.5 ns每次通话的同时MethodBase.GetCurrentMethod().DeclaringType需要2490 ns每次通话-所以你对因子的加快1200.
[Intel Core 2 6400 2.13 GHz | 3.5 GiB | WinXP Pro SP2 | .NET FX 3.5 SP1 | 发布| 没有调试器]