为了记录的目的,在我们的应用程序的一些方法包括以下行:
Dim Log As ILog = GetLog(Reflection.MethodBase.GetCurrentMethod().DeclaringType)
我有什么可以被描述为反射的非理性的恐惧,我尽量保持在检查。 然而,呼吁像这样有潜在的执行百倍第二个问题我的方法。 我不知道像我大概应该反思; 但是从资料上简单看,它看起来对我来说,我可以替换为以下:
Dim Log As ILog = GetLog(Me.GetType())
我的问题是三个方面:
- 是否
Me.GetType()
实际返回相同Type
的GetCurrentMethod().DeclaringType
? - 是否
Me.GetType()
实际上是从做任何事情, 不同的 GetCurrentMethod().DeclaringType
呢,还是做引擎盖下是一回事吗? - 我应该甚至不担心这个呢? 性能在此应用中至关重要的; 该程序运行正常,但我们的业务性质是这样的,如果我们能够在这里和那里刮掉甚至几微秒,这是非常有用的。
在您的情况this.GetType()
会产生相同的结果MethodBase.GetCurrentMethod().DeclaringType
一样。 请参阅JaredPar的答案的情况下都调用将返回不同的类型。
在一般情况下的类型曝光的部件(经由获得MemberInfo.ReflectedType
属性)和声明一个构件(通过所获得的类型MemberInfo.DeclaringType
属性)可以不同。
UPDATE
我只是用C#异形它- this.GetType()
需要2.5 ns
每通电话的同时MethodBase.GetCurrentMethod().DeclaringType
需要2490 ns
每次通话-让你拥有约因子加速1200
。
[英特尔酷睿2 6400 2.13 GHz的| 3.5吉布| 的WinXP专业版SP2 | .NET FX 3.5 SP1 | 发布| 如果没有调试器]
是否Me.GetType()返回为GetCurrentMethod()。DeclaringType?
这取决于。 Me.GetType总是返回的实际类型的对象。 GetCurrentMethod()。DeclaringType将返回其声明的方法类型。 这些值可以在继承的情况不同。
考虑以下
Class C1
Public Sub Foo()
..
End Sub
End Class
Class C2
Inherits C1
..
End Class
里面foo方法,如果你正在处理C1的一个实例的两个表达式是相等的。 但如果是C2,他们会有所不同。
是否Me.GetType()做任何事情不同于GetCurrentMethod()。DeclaringType
是的,这些都是非常不同的功能。 Me.GetType确定类别的当前实例的运行时类型。 GetCurrentMethod.DeclaringType决定了这个方法声明什么类型。
我应该甚至不担心这个呢?
如果这是一个性能的关键场景则是你要确保您的个人资料,你不明白的API。 尤其是那些似乎涉及反射。 但是,只有一个分析器会告诉你,这是确实快。 我的钱是Me.GetType虽然。
我只是有同样的问题,找到这个答案,但也许这是不是最新的更多,所以我后我testresults ...
我不知道该点.Net框架的早期版本,但在点.NET框架4我碰到下面的呼叫次数。 所以性能不应该是一个问题的任何更多...
- 第一次调用MethodBase.GetCurrentMethod()DeclaringType:0毫秒 - 221只蜱。
- 第一次调用this.GetType():0毫秒 - 225只蜱
下面是其中产生该输出的代码:
_txtReport.Text = string.Empty;
var sw = new Stopwatch();
sw.Start();
var type = MethodBase.GetCurrentMethod().DeclaringType;
sw.Stop();
_txtReport.Text += string.Format("First Call to MethodBase.GetCurrentMethod().DeclaringType: {0} ms - {1} ticks{2}",
sw.ElapsedMilliseconds, sw.ElapsedTicks, Environment.NewLine);
sw.Start();
var type1 = this.GetType();
sw.Stop();
_txtReport.Text += string.Format("First Call to this.GetType(): {0} ms - {1} ticks{2}",
sw.ElapsedMilliseconds, sw.ElapsedTicks, Environment.NewLine);