Unity3D熱更新全書-指令碼(三) C#LightEvil文法與調試

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   io   for   

調試,這是一個無法規避的問題

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,支援continuebreak,return

支援 if,可以if else嵌套

if(i==1)
{
}
else if(i==2)
{
}
else if(i==3)
{
}
else
{
}

不支援 while dowhile goto
命名空間 可以寫
Debug.Log();
不可以寫
UnityEnging.Debug.Log();
C#Evil 頭部可以寫using
不支援
對象調用 註冊了類型以後
new 支援
as 和 強制類型轉換 支援
成員變數訪問支援
成員函數調用支援
向類型註冊事件代理支援
支援對象的[] index訪問
靜態支援
C#Evil 可以在指令碼裡編寫class
指令碼裡編寫的class 不能繼承
數組 作為類型支援
比如可以將List<int>
Dictionary<int,string> 註冊成一個類型總體使用
不支援 int[] abc=new int[3]文法
傳入參數有int[] 可以註冊為類型使用。
由於數組是整體註冊一個關鍵字
所以註冊的List<int> 如果註冊關鍵字為”List<int>”,編寫時就不能寫成  List  <   ini  > 不能有空格,要不然關鍵字匹配不上
委託 支援指令碼編寫函數註冊給程式的委託介面
A.Test+=Func1;
A.SetTest(Func1);
兩種形式
 
匿名函數   不支援
異常處理   不支援trycatch

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有著良好的支援

只需要在運行指令碼時try一下,出錯以後用content.DumpValue 可以Dump出指令碼堆棧上的變數值

content.DumpStack 可以Dump出指令碼執行堆棧

再加上異常本身反饋的資訊

這是故意產生了一個錯誤

DumpValue是每一層指令碼函數上的變數

DumpStack就是指令碼堆棧,最上面一行告訴了我們bug所在 Test03.cs的第31行

SystemError是異常拋出的部分

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.