Dot-Net

VB.NET中CallbyName函式的缺點?

  • August 21, 2009

在 VB.NET中使用該CallByName函式在性能上有什麼缺點嗎?從 .NET 2.0 開始,有沒有更好的方法來按名稱進行呼叫。

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

引用自:https://stackoverflow.com/questions/1267588