C#轉typescript實戰

前言

最近剛在公司裏接了一個用egret來做遊戲的項目,在中間我將之前的C#寫的AI模塊及ECS框架移植到白鷺當中。這也是我第一次接觸Typescript這門語言,我很快的看過一遍官方文檔,發現與C#是非常的相似,特此以這篇文章記錄下我自己開發AI與ECS框架中遇到的問題及心得。

比較

下面介紹的都是typescript當中沒有與C#共同的點。如果有解決方案我也會在下面說明。

  • typescript中沒有 Internalprotected internal 修飾符。
  • typescript中沒有 virtualoverride修飾符。

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中沒有intdoublefloat等。統一使用number
  • typescript中沒有refout關鍵字。
  • typescript中Array使用很廣泛。可以代替C#的ListQueue等。
  • 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框架還在建設中。所以還沒這麼快發佈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章