2

宣言された変数の名前を取得する方法を知っている人はいますか?例えば:

Public Function returnName(variable as integer) as string

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

End Function

ILは渡された変数の名前を格納しないことを説明し、ほとんどの場合不可能と言って何度か試みたのを見てきましたが、名前をたどることができる具体的なポインターまたは参照があると信じるのは妥当なようです。誰かが私にこれについていくつかの見出しを与えることができますか?

なんで?これは純粋に個人的な調査です。

4

2 に答える 2

2

リフレクションを使用すると、メソッド引数の名前と、メソッド本体のコンテキスト内のローカル変数を取得できますが、ここで問題が発生します。それらを取得する唯一の方法は、プログラム用に生成された.pdbであるデバッグ情報ファイルを読み取ることです。

それには正当な理由があります。ジッタによって実行される最も重要なジョブの1つは、生成されたマシンコードからローカル変数を削除することです。そして、それらをCPUレジスタに置き換えます。これは非常に重要な最適化であり、コードの速度に大きな違いをもたらす可能性があります。メモリが遅く、CPUレジスタが高速です。これは、プログラムのリリースビルドで実行される最適化です。デバッガーを接続してプログラムのリリースバージョンをデバッグしようとしたときにも非常に目立ちます。デバッガーから多くの警告が表示され、ローカル変数の検査を依頼したときに、デバッガーが何を意味するのかわからないことがわかります。また、.pdbファイルを使用する場合の問題もあります。

ジッタによって実行される最適化の種類に関する背景説明の回答は、こちらから入手できます

于 2012-10-21T16:15:07.207 に答える
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_プレフィックスを取得します。

ここでも同じ質問がありましたが、C#でした。そこからVB.NETとその特定の例のコードを採用し、テストしました。

于 2012-10-21T14:47:16.437 に答える