2009-08-12 6 views
8

VB.NETでCallByName functionを使用すると、パフォーマンスに問題がありますか? .NET 2.0以降でNameによって呼び出すより良い方法はありますか?VB.NETのCallbyName関数の短所?

+0

私はCallByNameに精通していません。どのコンテキストで使用しますか?例がありますか? –

+0

CallByNameはリフレクションを使用します。だから、私は別の方法があるかどうかわからない。 CallByNameを使用しているシナリオを説明できますか? CallByNameなどが必要な場合は、それが決定するのに役立ちます。 – shahkalpesh

答えて

7

CallByBameは基本的に、コンパイラがあなたのために理解している「初期バインディング」とは対照的に、「実行時にメソッドを理解する」「レイトバインディング」を提供します。

アーリーバインディングを使用すると、型を安全にすることができ、コードがメソッドに正しく適用されるため、パフォーマンスが向上します。コンパイラは、あなたのために前もってあなたのために「見上げた」でしょう。

メソッドが実行時にルックアップされ、型の安全性がないため、遅延バインディングのパフォーマンスが低下します。つまり、メソッドが実際には存在しない可能性があり、例外が発生する可能性があります。しかし、何らかの理由でオブジェクトの種類がわからない場合は、これが便利です。また、interopアセンブリを混乱させたくない場合は、COMオブジェクトを呼び出すためにも使用します。

CallByNameは、おそらくType.InvokeMemberを呼び出します。 CallByName関数はメソッド・バインディングをキャッシュしない場合は、マッピングするハッシュテーブルを格納し、独自のディスパッチクラスを記述するためにはるかに良いだろう

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 Has a Name"は何もキャッシュしていないCallByNameについては正しいです。このように同じメソッドを繰り返し呼び出す場合は、何らかの形で型情報をキャッシュしたいと思うでしょう。あなたがしなければ物事は本当に遅くなることができます。 –

2

:あなたが直接それをしたい場合は、ここで私が思いついたいくつかのコードです名前の文字列をMethodInfoオブジェクトに変換します。