2009-08-12 5 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를 호출합니다. 당신이 직접 수행 할 경우, 여기에 내가 생각 해낸 몇 가지 코드는 다음과 같습니다

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

CallByName 기능을하지 캐시 방법 바인딩, 매핑하는 해시 테이블을 저장하는 자신의 파견 클래스를 작성하는 훨씬 더 좋을 것이다 않는 경우 이름 문자열은 MethodInfo 개체입니다.