thank you very much! reflection这个东西我也看了,但是不是太懂。 如果对了一个表达式,我已经能够判断它是一个有效的表达式,然后我怎么样去求它的值呢?你能不能给我点建议。再次谢谢你。
其实可以先不理会reflection机制,传统的基于堆栈的算符优先表达式求值算法并不复杂,你可以在编译原理/数据结构书上找到相关的例子,也就100行程序吧。 然后,是如何应用reflection的问题——其实不用也无所谓,用它只是提高效率而已。在算符优先算法中,是在分析表达式的过程中求值,例如对于a+5这个表达式,对不同的a必须重新分析表达式,重新进行大量的堆栈操作才能求得新的表达式值。但有了reflection的支持,我们可以将表达式分析和求值分开:在分析的过程中产生出球值必需的代码,比如a+5,在没有具体的a的情况下,我们可以分析表达式并生成下面的MSIL程序(reflection): .method public hidebysig static myexpression(int a) cil managed { .maxstack 2 ldarg.0 //push a to stack ldc.i4.5 //push 5 add //add a + 5 ret //return result } 这样对于每个a的值,我们就不必再分析表达式,可以直接进行a+5运算了,其效率不知要好多少倍!
Script正是因为缺少强大的语言能力以及力求简便所以才依靠强大的类库来支撑,但这样极大限制了其表达能力。C/C++/Pascal...中都没有eval类似的函数。
C#与C/C++相比在这一点上已经有了很大的进步——它支持eval的更高级形式,reflection。通过reflection,可以极大的提高表达式解析的效率。
reflection不是三言两语能够解释的,自己看相关资料吧。
http://www.oreilly.com/catalog/progcsharp/chapter/ch18.html
reflection这个东西我也看了,但是不是太懂。
如果对了一个表达式,我已经能够判断它是一个有效的表达式,然后我怎么样去求它的值呢?你能不能给我点建议。再次谢谢你。
然后,是如何应用reflection的问题——其实不用也无所谓,用它只是提高效率而已。在算符优先算法中,是在分析表达式的过程中求值,例如对于a+5这个表达式,对不同的a必须重新分析表达式,重新进行大量的堆栈操作才能求得新的表达式值。但有了reflection的支持,我们可以将表达式分析和求值分开:在分析的过程中产生出球值必需的代码,比如a+5,在没有具体的a的情况下,我们可以分析表达式并生成下面的MSIL程序(reflection):
.method public hidebysig static myexpression(int a) cil managed
{
.maxstack 2
ldarg.0 //push a to stack
ldc.i4.5 //push 5
add //add a + 5
ret //return result
}
这样对于每个a的值,我们就不必再分析表达式,可以直接进行a+5运算了,其效率不知要好多少倍!