前言
最近剛在公司裏接了一個用egret來做遊戲的項目,在中間我將之前的C#寫的AI模塊及ECS框架移植到白鷺當中。這也是我第一次接觸Typescript這門語言,我很快的看過一遍官方文檔,發現與C#是非常的相似,特此以這篇文章記錄下我自己開發AI與ECS框架中遇到的問題及心得。
比較
下面介紹的都是typescript當中沒有與C#共同的點。如果有解決方案我也會在下面說明。
- typescript中沒有
Internal
與protected internal
修飾符。 - typescript中沒有
virtual
與override
修飾符。
typescript雖然沒有這兩個修飾符,但是子類重寫父類只要是
protected
級別以上就能進行重寫,不需要任何修飾符
- typescript中
super
相當於C#的base
。
如果你有繼承某個類則它的構造函數中會強制要求寫上
super();
- typescript當中只要是引用自身的屬性或者方法都需要加上
this
。這與C#當中的this
有所不同,但也可以當做C#的this
來使用。 - typescript中沒有
operator
關鍵字,這意味着我們無法重載運算符。
可以通過js來進行重載然後來調用。我直接寫方法來代替運算符,感覺會更方便一些:
public add(value1: number, value2: number){ return value1 + value2; }
- typescript有
extends
來代表繼承類。implements
來繼承接口。同C#一樣只能繼承單一類,多接口。 - typescript中
instanceof
相當於C#的is
關鍵字。但是中間有所差別,instanceof
無法識別接口。
如果是使用egret可以使用
egret.is(實例, "接口名")
方法。
- typescript中
var
與C#當中的var
作用域不同。要注意typescript中儘量使用let
而不是使用var
。 - typescript中如果想指定泛型類型則使用
T extend A
。與C#當中where T : A
一樣的。 - typescript中聲明類型時
public localOffset: Vector2;
。 C#聲明類型public Vector2 localOffset;
- typescript中沒有
int
、double
、float
等。統一使用number
。 - typescript中沒有
ref
、out
關鍵字。 - typescript中
Array
使用很廣泛。可以代替C#的List
、Queue
等。 - typescript中可以省略
;
不過養成習慣還是都加上。 - typescript中沒有
Dictionary
在typescript高版本當中有
Map
可以代替。低版本當中可以使用private _components: {[key: number]: Array<IRenderable>} = {};
相當於C#當中
private Dictionary<int, List<IRenderable>> _components = new Dictionary<int, List<IRenderable>>();
但是這樣有所侷限性,key只能爲
number
或者string
。
typescript的存儲器
private _tag: number; public get tag(){ return this._tag; } public set tag(value: number){ this._tag = value; }
C#的存儲器
private int _tag; public int tag{ get{return _tag;} set{_tag = value;} }
總結
以上就是我使用typescript發現與C#不同之處。可以幫助大家少走很多路,我的AI系統也已經完美移植到Egret之上。大家有興趣可以前去翻閱。在我發這篇帖子時ecs框架還在建設中。所以還沒這麼快發佈。