xlua筆記 2 C 載入lua檔案

2022-09-25 17:33:11 字數 1978 閱讀 4191

這裡指的是c#主動發起對lua資料結構的訪問。 本章涉及到的例子都可以在xlua\tutorial\csharpcalllua下找到。

獲取乙個全域性基本資料型別 訪問luaenv.global就可以了,上面有個模版get方法,可指定返回的型別。

luaenv.global.get("a")

luaenv.global.get("b")

luaenv.global.get("c")

訪問乙個全域性的table

也是用上面的get方法,那型別要指定成啥呢?

對映到普通class或struct

定義乙個class,有對應於table的字段的public屬性,而且有無引數建構函式即可,比如對於可以定義乙個包含public int f1;public int f2;的class。 這種方式下xlua會幫你new乙個例項,並把對應的字段賦值過去。

table的屬性可以多於或者少於class的屬性。可以巢狀其它複雜型別。 要注意的是,這個過程是值拷貝,如果class比較複雜代價會比較大。而且修改class的字段值不會同步到table,反過來也不會。

這個功能可以通過把型別加到gcoptimize生成降低開銷,詳細可參見配置介紹文件。 那有沒有引用方式的對映呢?有,下面這個就是:

對映到乙個inte***ce

這種方式依賴於生成**(如果沒生成**會拋invalidcastexception異常),**生成器會生成這個inte***ce的例項,如果get乙個屬性,生成**會get對應的table欄位,如果set屬性也會設定對應的字段。甚至可以通過inte***ce的方法訪問lua的函式。

更輕量級的by value方式:對映到dictionary<>,list<>

不想定義class或者inte***ce的話,可以考慮用這個,前提table下key和value的型別都是一致的。

另外一種by ref方式:對映到luatable類

這種方式好處是不需要生成**,但也有一些問題,比如慢,比方式2要慢乙個數量級,比如沒有型別檢查。

訪問乙個全域性的function

仍然是用get方法,不同的是型別對映。

對映到delegate

這種是建議的方式,效能好很多,而且型別安全。缺點是要生成**(如果沒生成**會拋invalidcastexception異常)。

delegate要怎樣宣告呢? 對於function的每個引數就宣告乙個輸入型別的引數。 多返回值要怎麼處理?從左往右對映到c#的輸出引數,輸出引數包括返回值,out引數,ref引數。

引數、返回值型別支援哪些呢?都支援,各種複雜型別,out,ref修飾的,甚至可以返回另外乙個delegate。

delegate的使用就更簡單了,直接像個函式那樣用就可以了。

對映到luafunction

這種方式的優缺點剛好和第一種相反。 使用也簡單,luafunction上有個變參的call函式,可以傳任意型別,任意個數的引數,返回值是object的陣列,對應於lua的多返回值。

使用建議

訪問lua全域性資料,特別是table以及function,代價比較大,建議盡量少做,比如在初始化時把要呼叫的lua function獲取一次(對映到delegate)後,儲存下來,後續直接呼叫該delegate即可。table也類似。

如果lua側的實現的部分都以delegate和inte***ce的方式提供,使用方可以完全和xlua解耦:由乙個專門的模組負責xlua的初始化以及delegate、inte***ce的對映,然後把這些delegate和inte***ce設定到要用到它們的地方。

總結:專案內:

1.使用ref方式讀取lua層資料

2.lua函式盡量使用「生成**」的對映delegate方。使用luafunction方式如果有引數或者返回值,大概率會有裝箱拆箱發生。

3.table以及function,代價比較大,建議盡量少做,比如在初始化時把要呼叫的lua function獲取一次(對映到delegate)後,儲存下來,後續直接呼叫該delegate即可。table也類似

xlua筆記 1 C 載入lua檔案

執行字串 最基本是直接用luaenv.dostring執行乙個字串,當然,字串得符合lua語法 比如 luaenv.dostring print hello world 完整 見xlua tutorial loadluascript bystring目錄 但這種方式並不建議,更建議下面介紹這種方法。...

C 學習筆記2 C 變數

1 當乙個精度高的資料型別與乙個精度低的資料型別進行運算時,定義運算結果的變數型別必須與精度最高的變數型別相同。這是為了防止在運算過程中造成資料丟失。如下 double a 42.29 int b 4229 int c a b console.writeline c c console.readke...

筆記2 C 對C的加強

首先是標頭檔案的引用問題,c 中引用標頭檔案不使用字尾 h 目的是為了與c語言進行區分。1 當使用時,相當於在c中呼叫庫函式,使用的是全域性命名空間,也就是早期的c 實現 2 當使用的時候,該標頭檔案沒有定義全域性命名空間,必須使用namespace std 這樣才能正確使用cout。使用c 標準程...