zoukankan      html  css  js  c++  java
  • Unity3D热更新全书-脚本(三) C#LightEvil语法与调试

    调试,这是一个无法规避的问题

    C#Light 由于有 词法解释、语法解释、运行时三种情况

    所以和C#也是有类似的问题

    出错大致可以分为编译错误和运行时错误

    拼写出莫名的东西或者语法不正确,会在编译阶段报错,这种错误很好检查,因为

    C#Light语法是C#的严格子集,所有的C#Light脚本都可以用C#的标准做语法检查

    这也是C#Light基本上是用VisualStudio做编辑器的原因所在,直接作为C#代码编译,可以排除大部分的语法问题。

    然后剩下的一些作为C#代码可以编译过,但是C#Light却编译不过,就是因为C#Light是C#的子集,没有100%的实现C#所有的语法

    词法错误C#Light的 tokenParser会抛出异常,观察此异常即可获知问题所在

    语法错误 C#Light的编译器会抛出异常,同理,观察异常可知。

    不过你还是需要了解哪些语法会导致异常

    我们先来列出那些不支持的语法:

    项目 支持 不支持

    注释

    支持// 不支持 /* */
    基本类型 支持int uint bool string float double 不支持byte char short 等,但可以扩展
    变量和定义 同c#定义变量方式,先定义再使用,可以在定义同时赋值。

    int i;
    int j=0;
    int k=i+1;
    bool b1;
    bool b2=true;
    bool b3=false;

     
    数学计算

    同c#

    支持

    + - * / %

    五种数学计算

    支持

    += -= /= *= %=

    五种自运算

    支持

    ++ --

    两种自增运算,只支持变量在左侧

    ++i 不支持  i++ 支持

    支持

    > >= < <= != == && ||

    八种逻辑运算

    支持! 取反

    支持三目运算?:

    不支持位运算
    循环 支持 for foreach while dowhile ,支持continuebreak,return

    支持 if,可以if else嵌套

    不支持switch goto
    命名空间 可以写
    Debug.Log();
    不可以写
    UnityEnging.Debug.Log();
    C#Evil 头部可以写using
    不支持
    对象调用 注册了类型以后
    new 支持
    as 和 强制类型转换 支持
    成员变量访问支持
    成员函数调用支持
    向类型注册事件代理支持
    支持对象的[] index访问
    静态支持
    C#Evil 可以在脚本里编写class
    脚本里编写的class 不能继承
    数组 数组完整支持
    支持
    new int[3]
    new int[]{1,2,3}
    两种语法
    任何类型数组都必须注册子类型和数组类型
    泛型数组
    作为类型支持
    比如可以将List<int>
    Dictionary<int,string> 注册成一个类型总体使用
     
    泛型 支持

    List<int> 作为一个类型不能有空格
    例如 List  <  int > 就不认识了
     
    委托 支持脚本编写函数注册给程序的委托接口
    A.Test+=Func1;
    A.SetTest(Func1);
    两种形式
     
    匿名函数 支持lambda表达式
    可以给委托赋值
    不支持 将lambda 表达式赋值给var变量
    异常处理 支持  
    继承 可以继承脚本中编写的interface,可以多继承 不支持class继承
    get/set 只支持自动实现
    int i
    {
      get;
      set;
    }
    不支持编写get/set过程
         

    C#Light能够有权限调用的类型需要提前注册

    env.RegType(new CSLE.RegHelper_Type(typeof(UnityEngine.Debug)));

    env.RegType(new CSLE.RegHelper_Type(typeof(List<string>),"List<string>"));
    env.RegType(new CSLE.RegHelper_Type(typeof(List<int>), "List<int>"));
    env.RegType(new CSLE.RegHelper_Type(typeof(List<List<int>>), "List<List<int>>"));

    委托的注册稍微不太一样

    env.RegDeleType(new CSLE.RegHelper_DeleAction("Action"));
    env.RegDeleType(new CSLE.RegHelper_DeleAction<int>("Action<int>"));
    env.RegDeleType(new CSLE.RegHelper_DeleAction<int,string>("Action<int,string>"));

    简单的类型不用填第二个参数关键字。

    虽然不支持那一列看起来好多,实际上不会很影响,接下来说明运行时出错的排查方法

    运行时排错一般有

    1.打Log进行判断

    2.断点调试

    2.错误上下文分析(堆栈分析、附近变量分析)

    C#Light不提供断点调试功能,关于打Log,这个直接调用Debug.Log即可

    错误上下文C#Light有着良好的支持

    image

    只需要在运行脚本时try一下,出错以后用content.DumpValue 可以Dump出脚本堆栈上的变量值

    content.DumpStack 可以Dump出脚本执行堆栈

    再加上异常本身反馈的信息

    image

    这是故意产生了一个错误

    DumpValue是每一层脚本函数上的变量

    DumpStack就是脚本堆栈,最上面一行告诉了我们bug所在 Test03.cs的第31行

    SystemError是异常抛出的部分

  • 相关阅读:
    “二柱子四则运算”终结版
    “睡眠猴子”团队项目及成员介绍
    最大联通子数组的和
    构建之法阅读笔记04
    构建之法阅读笔记03
    “进度条”博客——第五周
    构建之法阅读笔记02
    构建之法阅读笔记01
    “进度条”博客——第四周
    课后实验6--二维数组最大联通子数组的和
  • 原文地址:https://www.cnblogs.com/crazylights/p/3888932.html
Copyright © 2011-2022 走看看