AScript之eval函数详解
示例1 Console.WriteLine(new Script().Eval(int n10;eval(\n20\))); // 30 2 Console.WriteLine(new Script().Eval(int n10;eval(\n20\), ECompileMode.All)); // 30 3 Console.WriteLine(new Script().Eval(int n10;var s\n20\;eval(s))); // 30 4 Console.WriteLine(new Script().Eval(int n10;var s\n20\;eval(s), ECompileMode.All)); // 20 5 Console.WriteLine(new Script().Eval(int n10;eval(\n20\);n)); // 30 6 Console.WriteLine(new Script().Eval(int n10;eval(\n20\);n, ECompileMode.All)); // 30 7 Console.WriteLine(new Script().Eval(int n10;var s\n20\;eval(s);n)); // 30 8 Console.WriteLine(new Script().Eval(int n10;var s\n20\;eval(s);n, ECompileMode.All)); // 10为什么第4行输出结果是20第8行输出结果是10呢我们来看一下eval函数的运行机制。二、运行机制eval函数实际是调用Script中的Eval方法使用脚本中的当前编译上下文BuildContext、数据上下文ScriptContext和编译选项BuildOptions我们把当前脚本当作主干A把eval中的脚本当作分支A1分支A1是共享主干A中的上下文和编译选项1、在解析执行模式下可以使用和修改主干A中的变量分支A1中自定义的变量也可以传递到主干A中。2、在编译执行模式下又有所不同分2种场景1参数为字符串常量此时会将字符串的解析结果合并到主干A中进行编译和执行不会产生分支A1。2参数为变量由于编译期间无法确定变量的值无法合并到主干A中进行编译此时会产生分支A1进行单独编译执行分支A1只能共享主干A的变量定义无法共享赋值语句所以分支A1中的变量n为0且修改变量值也无法同步到主干中。