C# 高級語法特性(二)
1.0版本包含了C#語言最核心的部分,但僅有這些,會發(fā)現(xiàn)在實際開發(fā)中會遇到很多麻煩事,語言版本的迭代也是基于這些考慮在原有版本的基礎(chǔ)上加入一些新特性,使得編程語言在處理一些問題上更加高效、方便、簡潔和增強代碼靈活性。
C# 2.0
羅列一下2.0版本主要提供的特性:
泛型
partial
匿名方法
迭代器
協(xié)變和逆變
靜態(tài)類
委托判斷
泛型
泛型基本用法無需再贅述,與其它編程語言的泛型機制差別不大,泛型用的比較多的地方是底層、通用的模塊。在設(shè)計一些框架或者庫的底層時,對泛型類、泛型接口要求會比較高(包括逆變和協(xié)變),一般的開發(fā)其實無需過于深入理解泛型設(shè)計。
分部類型partial
微軟官方文檔指出partial關(guān)鍵字設(shè)計是用來把一個類的職責(zé)拆分給不同的開發(fā)者,而在Unity中,通常用于提供給UI類拆分出View
和Controller
的職責(zé)。例如拆分出UI.cs
和UI.Designer.cs
:
UI.cs(Controller的職責(zé)):
public partial class UI{
???????void Init(){}
? ? ? ?void Start(){}
? ? ? ?...
}
UI.Designer.cs(View的職責(zé)):
public partial class UI{
? ? ? ?public Button Button;
? ? ? ?public Text Text;
? ? ? ?...
}
另外,在一個包含大量成員的靜態(tài)類中使用partial,可以將它們拆分到不同的文件中,看起來可能會是:
StaticClass.XXX.cs:
public static partial class StaticClass{
? ? ? ?public static X;
? ? ? ?...
}
StaticClass.YYY.cs:
public static partial class StaticClass{
? ? ? ?public static Y;
? ? ? ?...
}
迭代器
多花一些篇幅討論迭代器,基本形式看起來會是:
????// IEnumerable接口定義
????public interface IEnumerable{
? ?????IEnumerator GetEnumerator();
????}
????// IEnumerator接口定義
????public interface IEnumerator{
? ?????bool MoveNext();
? ?????object Current{get;}
? ?????void Reset();
????}
????// 第一種形式
????public class EnumClass : MonoBehaviour{
? ???????void Start(){
?????????????foreach(var v in EnumValue()){
? ? ? ? ? ?????Debug.Log(v); // 將輸出1 2 3
? ? ? ???????}
? ?????? }
? ???????IEnumerable EnumValue(){
? ? ? ?????yield return 1;
? ? ? ?????yield return 2;
? ? ? ?????yield return 3;
? ?????? }
????}
// 第二種形式
class EnumClass : IEnumerable
{
? ?public IEnumerator GetEnumerator()
? ?{
? ? ? ?yield return 1;
? ? ? ?yield return 2;
? ? ? ?yield return 3;
? ?}
}
void Start()
{
? ?foreach(var e in new EnumClass())
? ?{
? ? ? Debug.Log(e);
? ?}
? ?// foreach 同等實現(xiàn)
? ?var e = new EnumClass().GetEnumerator();
? ?while(e.MoveNext()){
? ? ? ?Debug.Log(e.Current);
? ?}
}
Coroutine
首先在此利用Unity中的Update()方法模擬Coroutine:
???...
? ?IEnumerator e; // 獲取到某個IEnumerator
? ?void Update(){
? ? ? ?if(e.MoveNext()){
? ? ? ? ? ?...
? ? ? ?}
? ?}
Update()方法將會在每一幀輸出迭代器中的內(nèi)容,再使用StartCoroutine()方法啟動協(xié)程:
StartCoroutine(e); // StartCoroutine方法會不停地調(diào)用MoveNext()方法直到結(jié)束
會發(fā)現(xiàn)兩者效果一樣,可以推斷Unity也是通過枚舉來運行程序塊的。Coroutine則其實是一個迭代器模式+定時器的一種實現(xiàn)。
靜態(tài)類
靜態(tài)類稍微一提,關(guān)鍵的兩點:
不能被實例化
靜態(tài)構(gòu)造函數(shù)在靜態(tài)類成員被第一次訪問時調(diào)用