VB.NET中CallbyName函数的缺点?
Posted
技术标签:
【中文标题】VB.NET中CallbyName函数的缺点?【英文标题】:Disadvantages of CallbyName Function in VB.NET? 【发布时间】:2009-08-12 17:34:14 【问题描述】:在 VB.NET 中使用CallByName
function 是否有任何性能劣势?在 .NET 2.0 以后有没有更好的方法来按名称进行调用。
【问题讨论】:
我不熟悉 CallByName,你会在什么情况下使用它?你有例子吗? CallByName 将使用反射。所以,不知道有没有别的办法。您能否描述一下您使用 CallByName 的场景?这将有助于确定您是否需要 CallByName 或其他内容。 【参考方案1】:CallByBame 基本上为您提供“后期绑定”,即“在运行时找出方法”,而不是编译器为您找出方法的“早期绑定”。
使用早期绑定,您可以确保类型安全,并且您将获得更好的性能,因为您的代码将直接进入方法。编译器会提前为您“查找”。
由于在运行时查找方法并且您没有类型安全性,因此后期绑定性能较慢 - 这意味着该方法可能实际上不存在并且您可能会遇到异常。但是,如果您由于某种原因不知道对象的类型,这可能会很方便。如果我不想弄乱互操作程序集,我也用它来调用 COM 对象。
CallByName 最有可能调用 Type.InvokeMember。如果你想直接做,这是我想出的一些代码:
Imports System.Reflection ' For access to BindingFlags '
Friend NotInheritable Class LateBinding
Private Const InvokePublicMethod As BindingFlags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod
Private Const GetPublicProperty As BindingFlags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.GetProperty
Public Shared Function InvokeFunction(ByVal oObject As Object, ByVal sName As String, ByVal ParamArray yArguments() As Object) As Object
Return oObject.GetType().InvokeMember(sName, InvokePublicMethod, Nothing, oObject, yArguments)
End Function
Public Shared Function GetProperty(ByVal oObject As Object, ByVal sName As String, ByVal ParamArray yArguments() As Object) As Object
Return oObject.GetType().InvokeMember(sName, GetPublicProperty, Nothing, oObject, yArguments)
End Function
End Class
【讨论】:
“Cecil 有名字”关于 CallByName 没有缓存任何东西是正确的。如果您以这种方式重复调用相同的方法,您将希望以某种方式缓存类型信息。如果你不这样做,事情真的会慢下来。【参考方案2】:如果CallByName
函数不缓存方法绑定,最好编写自己的调度类来存储哈希表以将名称字符串映射到MethodInfo
对象。
【讨论】:
以上是关于VB.NET中CallbyName函数的缺点?的主要内容,如果未能解决你的问题,请参考以下文章