Ci sono degli svantaggi nelle prestazioni usando lo CallByName
function in VB.NET? C'è un modo migliore per fare la chiamata per nome in .NET 2.0 in poi.Svantaggi della funzione CallbyName in VB.NET?
risposta
CallByBame fornisce fondamentalmente "binding in ritardo", ovvero "calcolo del metodo in fase di esecuzione" anziché "associazione anticipata" in cui il compilatore lo rileva.
Con l'associazione anticipata è possibile digitare sicuro e ottenere prestazioni migliori poiché il codice andrà bene al metodo. Il compilatore avrà "cercato" per te in anticipo.
Con le prestazioni di binding tardive è più lento poiché il metodo viene rilevato in fase di esecuzione e non si dispone di sicurezza del tipo, il che significa che il metodo potrebbe non esistere realmente e si potrebbe ottenere un'eccezione. Ma questo potrebbe essere utile se non si conosce il tipo di oggetto per qualche motivo. Lo uso anche per chiamare l'oggetto COM se non voglio fare confusione con un assembly di interoperabilità.
CallByName molto probabilmente chiama Type.InvokeMember. Se si vuole farlo direttamente, ecco qualche codice mi si avvicinò con:
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 ha un nome" è corretto su CallByName che non memorizza nella cache nulla. Se stai chiamando ripetutamente gli stessi metodi in questo modo, ti consigliamo di memorizzare le informazioni sul tipo in qualche modo. Le cose possono davvero rallentare se non lo fai. –
Se la funzione CallByName
non di metodo di cache attacchi, sarebbe molto meglio scrivere la propria classe dispaccio che memorizza una tabella hash per mappare stringhe di nome negli oggetti MethodInfo
.
Non ho familiarità con CallByName, in quale contesto lo utilizzeresti? Hai un esempio? –
CallByName utilizzerà la riflessione. Quindi, non so se c'è un altro modo. Potresti descrivere lo scenario in cui stai usando CallByName? Questo aiuterà a determinare se hai bisogno di CallByName o qualcos'altro. – shahkalpesh