直到最近,我才发现Java和C#都不支持局部变量的反射。例如,不能在运行时检索局部变量的名称。
虽然这显然是一种有意义的优化,但我很好奇当前是否有任何语言支持所有声明和构造的完整和完整的反映。
编辑:,我将进一步限定我的“局部变量名称”示例。在C#中,可以使用反射将参数名称输出到方法:
foreach(ParameterInfo pi in typeof(AClass).GetMethods()[0].GetParameters())
Trace.WriteLine(pi.Name);您不需要知道参数的名称(甚至是方法的名称)--所有这些都包含在反射信息中。在一种全面反思的语言中,你可以做到:
foreach(LocalVariableInfo lvi in typeof(AClass).GetMethods()[0].GetLocals())
Trace.WriteLine(lvi.Name);应用程序可能是有限的(反射的许多应用程序都是如此),但是,我希望有一种完整的反射语言来支持这样的结构。
编辑:由于现在有两个人有效地说过“没有必要反映局部变量名”,下面是一个基本示例,说明为什么它有用:
void someMethod()
{
SomeObject x = SomeMethodCall();
// do lots of stuff with x
// sometime later...
if (!x.StateIsValid)
throw new SomeException(String.Format("{0} is not valid.", nameof(x));
}当然,我可以在字符串中硬编码"x“,但是正确的重构支持使得这是一个大的不-不。nameof(x)或反映所有名称的能力是目前缺少的一个很好的特性。
发布于 2012-03-01 13:18:32
你关于局部变量名称的介绍性发言引起了我的兴趣。
此代码将实际检索lambda表达式中的本地变量的名称:
static void Main(string[] args)
{
int a = 5;
Expression<Func<int>> expr = (() => a);
Console.WriteLine(expr.Compile().Invoke());
Expression ex = expr;
LambdaExpression lex = ex as LambdaExpression;
MemberExpression mex = lex.Body as MemberExpression;
Console.WriteLine(mex.Member.Name);
}还请看一下这个提到回答的LocalVariableInfo。
发布于 2012-03-01 12:51:19
是的,有些语言(至少在某种程度上)是可能的。我认为Smalltalk和Python中的反射对于任何合理的定义都是相当“完整”的。
也就是说,获取局部变量的名称是毫无意义的--根据定义,要获得该变量的名称,您必须知道它的名称。我不认为缺乏一项行动来执行这一确切的任务是一个空白的反思设施。
第二个示例不是“确定局部变量的名称”,而是检索所有局部变量的名称,这是一个不同的任务。Python中的等效代码是:
for x in locals().iterkeys(): print x发布于 2012-03-01 18:25:07
呃,为了访问本地变量,您必须在堆栈框架/上下文/任何本地变量有效的地方。因为它只在那个时间点有效,那么它被称为't1‘还是'myLittlePony’有关系吗?
https://stackoverflow.com/questions/9516436
复制相似问题