查找变量的声明名称

时间:2012-10-21 14:07:38

标签: vb.net

有谁知道如何获取声明变量的名称。例如:

Public Function returnName(variable as integer) as string

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

End Function

我已经看过它尝试了几次,大多数人说这是不可能的,解释说IL不存储传递的变量的名称,但是相信有一些有形的指针或引用可以追溯到名称似乎是合理的。任何人都可以给我一些标题。

为什么呢?这纯粹是个人研究。

2 个答案:

答案 0 :(得分:2)

Reflection可以获取方法参数的名称,也可以获取方法体上下文中的局部变量,但这就是buck停止的地方。获取它们的唯一方法是读取调试信息文件,即为程序生成的.pdb。

这是有充分理由的。抖动执行的最重要的任务之一是从生成的机器代码中删除局部变量。并用cpu寄存器替换它们。这是一个非常重要的优化,可以在代码的速度上产生很大的差异。内存很慢,cpu寄存器很快。这是在程序的发布版本中执行的优化。当您尝试通过附加调试器来调试程序的发行版时,也非常明显。您将从调试器中收到很多警告,告诉您当您要求它检查局部变量时它不知道您的意思。以及使用.pdb文件时的失败。

关于抖动执行优化的背景答案是available here

答案 1 :(得分:1)

检查方法如下所示:

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

这是你检查variable名称的方法,假设它是Integer类型(你的例子):

Check(Of Integer)(Function() variable)

或者,通过类型推断,variable可以是任何类型:

Check(Function() variable)

完全适用于类级别变量,本地人获得$VB$Local_前缀。

同样的问题被问到here,但在C#中。我从那里为VB.NET和您的特定示例采用了代码,并对其进行了测试。