有谁知道如何获取声明变量的名称。例如:
Public Function returnName(variable as integer) as string
Dim [string] as string = string.empty
[string] = variable.name
return [string]
End Function
我已经看过它尝试了几次,大多数人说这是不可能的,解释说IL不存储传递的变量的名称,但是相信有一些有形的指针或引用可以追溯到名称似乎是合理的。任何人都可以给我一些标题。
为什么呢?这纯粹是个人研究。
答案 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和您的特定示例采用了代码,并对其进行了测试。