2009-08-12 12 views
8

¿Hay alguna desventaja en el rendimiento al usar CallByName function en VB.NET? ¿Hay alguna forma mejor de hacer la llamada por Nombre en .NET 2.0 en adelante?Desventajas de la función CallbyName en VB.NET?

+0

No estoy familiarizado con CallByName, ¿en qué contexto lo usaría? ¿Tienes un ejemplo? –

+0

CallByName usará la reflexión. Entonces, no sé si hay otra forma. ¿Podría describir el escenario en el que está utilizando CallByName? Eso ayudará a determinar si necesita CallByName u otra cosa. – shahkalpesh

Respuesta

7

CallByBame básicamente le da "enlace tardío" que es "averiguar el método en tiempo de ejecución" en lugar de "enlace anticipado" donde el compilador lo encuentra por usted.

Con la vinculación anticipada puede ser seguro y tendrá un mejor rendimiento, ya que su código irá directamente al método. El compilador lo habrá "revisado" por adelantado.

Con el rendimiento de enlace tardío es más lento ya que el método se busca en tiempo de ejecución y no tiene seguridad de tipo - lo que significa que el método puede no existir realmente y puede obtener una excepción. Pero esto podría ser útil si no conoce el tipo de objeto por alguna razón. También lo uso para llamar al objeto COM si no quiero meterme con un ensamblado de interoperabilidad.

CallByName probablemente llama a Type.InvokeMember. Si desea hacerlo directamente, aquí hay un código que se me ocurrió:

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 
+1

"Cecil tiene un nombre" es correcto acerca de que CallByName no almacena en caché nada. Si llama repetidamente los mismos métodos de esta manera, querrá guardar en caché la información del tipo de alguna manera. Las cosas realmente pueden ralentizar si no lo haces. –

2

Si la función CallByName no enlaces de método de caché, sería mucho mejor para escribir su propia clase de despacho que almacena una tabla hash para mapear nombre de cadenas a MethodInfo objetos.

Cuestiones relacionadas