2012-10-21 3 views
2

선언 된 변수의 이름을 얻는 방법을 아는 사람은 누구입니까? 예를 들어 :선언 된 변수 이름 찾기

Public Function returnName(variable as integer) as string 

Dim [string] as string = string.empty 
[string] = variable.name 
return [string] 

End Function 

필자는 몇 가지 유형의 포인터 또는 수 참조가 그러나 믿기 합리적인 것, 그것은 대부분의 IL 통과 변수의 이름을 저장하지 않음을 설명하는, 그것의 불가능을 말하는 몇 번 시도 볼 이름으로 추적된다. 누구든지이 부분에 대해 어떤 표제를 줄 수 있습니까?

왜? 이것은 순전히 개인적인 연구입니다. (당신의 예)

Private Shared Function Check(Of T)(expr As Expression(Of Func(Of T))) As String 
    Dim body = DirectCast(expr.Body, MemberExpression) 
    Return body.Member.Name 
End Function 

을 그리고 이것은이 유형 Integer의의 가정, 당신은 variable의 이름을 확인 할 방법은 다음과 같습니다 :

+0

함수에 대한 매개 변수에 메서드 호출에 사용 된 값의 복사본이 할당되는 것은 (특히 주어진 예제에서)별로 의미가 없습니다. ByRef 매개 변수의 경우에도 큰 의미가 없습니다. "포인터 또는 참조"가 있다고 가정 할 이유가 없습니다. 일반적으로 그런 것이 필요하지 않습니다. –

+0

포인터 참조를 믿을만한 완벽한 이유가 있다고 생각합니다. 해당 변수의 정보에 대한 경로가 있어야합니다. ByRef는 변수에 대한 참조를 전달합니다. 사실을 통해 당신의 위치를지지 할 수 있습니까? – Ccorock

+1

당신의 예제 메소드가 주어지면,'returnName (a + 5)'에 의해 호출되었을 때 그 응답은 어떻게 될 것이라고 기대할 수 있습니까? 그게 완벽하게 합법적 인 호출이기 때문입니다 ('a'는 그때 범위 변수입니다). –

답변

2

리플렉션은 메서드 본문의 컨텍스트에서 메서드 인수의 이름과 로컬 변수를 가져올 수 있지만 그 위치는 벅이 멈 춥니 다. 그 (것)들을 얻는 유일한 방법은 프로그램을 위해 생성되는 .pdb 인 디버그 정보 파일을 읽는 것입니다.

그 이유가 있습니다. 지터로 수행되는 가장 중요한 작업 중 하나는 이며 생성 된 머신 코드에서 로컬 변수를 제거합니다. 그리고 그들을 cpu 레지스터로 대체하십시오. 이는 코드의 속도면에서 큰 차이를 만들 수있는 매우 중요한 최적화입니다. 메모리가 느리고 CPU 레지스터가 빠릅니다. 이는 프로그램의 릴리스 빌드에서 수행되는 최적화입니다. 또한 디버거를 연결하여 프로그램의 릴리스 버전을 디버깅 할 때 매우 눈에 띄게 표시됩니다. 디버거에서 많은 경고를받습니다. 디버거에서 로컬 변수를 검사 할 때 어떤 의미인지를 알 수 없다는 것을 알려줍니다. 그리고 .pdb 파일을 사용할 때의 몰락.

지터로 수행되는 최적화의 종류에 대한 배경 지식은 available here입니다.

1

검사 방법은 다음과 같을 수 있습니다

Check(Of Integer)(Function() variable) 

또는, 유형 추론을 통해, variable은 임의의 유형일 수있다 :

Check(Function() variable) 

클래스 수준 변수의 경우 정확하게 작동하지만 지역 변수는 $VB$Local_ 접두어입니다.

같은 질문은 here,하지만 C#. VB.NET 및 특정 예제에 대한 코드를 채택하여 테스트했습니다.

+0

물론,이 메소드에 전달되는 좀 더 복잡한 표현식이'DirectCast'를 날려 버리지 않도록하는 방법은 없습니다 (컴파일 타임에). –

+0

@Damien_The_Unbeliever : 흥미로운 점은 예외를 던지지 않고 매우 멋지게 불어 나고 있다는 것입니다. 스택이 kaboom으로 넘어 가고 함수가 조기에 종료됩니다. – Neolisk

+0

매우 흥미 롭습니다. – Ccorock