標籤:unity3d培訓 3d遊戲開發 unity3d遊戲 unity培訓 unity3d學習
接觸 C# 一年,總體上是一個非常完善的語言,但是某些細節特徵還是不夠完美。這裡記下我現在對它將來的一些期望。
更強大的泛型約束
與 C++ 的模板相似,C# 的泛型使得編寫適用於多種類型的代碼更加簡潔。如果沒有泛型,我們可能需要使用 object 並執行類型轉換,或者針對每一種類型寫大量雷同的代碼。在泛型型別約束上,C# 一如既往的嚴格,但是由於泛型約束還不完善,有時不得不寫一些重複的代碼。比如下面這個例子:
public static T MaxT(T a, T b) where T is int or long or float or double
{
return a = b ? a : b;
}
可惜現在的 C# 還沒有這個功能......System.Math 的做法就是為各種類型分別寫一個 Max 方法。
關於C#的泛型約束參考這裡:型別參數的約束,模板與泛型的區別:C++ 模板和 C# 泛型之間的區別。
命名空間範圍的訪問修飾
C# 提供了 internal 存取修飾詞來保護程式集內部類型或成員,但是實際開發中我們經常也需要在一個程式集中劃分子模組。為了更清楚的把同一個子模組內部的類之間公開的內容與不同的子模組之間公開的內容區別開,希望未來 C# 可以提供命名空間範圍的訪問修飾。比如下面這個例子:
namespace Moudle
{
public class Common { ... }
private class Secret { ... }
}
添加 private 類型的訪問修飾,這樣 Common可以訪問 Secret,Secret 類型在 Moudle命名空間可見,對 Moudle 之外是不可見的。注意,現在的 C# 不允許命名空間內的元素宣告為 private 或 protected。C++ 中的友元也可以解決這個問題,但是我猜你們都不喜歡 friend。。。
使用內部類可以一定程度上解決這個問題,但是太不自由了。在 Unity 開發中這個問題更嚴重,因為指令碼組件必須寫在單獨的檔案、且不可以為內部類。
可定義變數的引用
C# 支援在方法參數上使用 ref 和 out 關鍵字來引用實參,這對結構類型非常重要,否則你很難通過方法來修改結構本身的值。但是可能是為了避免 C# 太過複雜,所以這個特性僅限於方法參數。這樣我們經常遇到看起來很不正常的問題。比如 foreach 遍曆結構類型集合無法修改值,用下標遍曆結構數組只能使用數組名+。為了避免太複雜,可以限制僅可以定義一級引用。
foreach(ref Vector3 position in positions)
{
position.x = 0;
}
更自由的擴充方法
現在的擴充方法必須寫在單獨的靜態類裡,而且必須使用了命名空間才可以使用。這就是一個沒有意義的限制。我們按功能模組來劃分代碼,發現某一個方法使用擴充的形式來編寫更優雅,於是不得不把這個方法拿出去,放到某個名字沒有意義的靜態類裡。這太無聊了!另外,擴充方法不支援以屬性的形式擴充、不支援以引用的形式擴充,都是需要改進的。
class MyClass
{
public static DoSomething(this OtherClass obj, ...) { ... }
public static getSetSomething(this OtherClass obj){ get {...} set{...} }
public static void ModifyValue(this ref ValueType value) { ... }
}
更簡潔的命名空間使用規則
看這個例子:
using A.B;
class MyClass { A.B.C.OtherClass x; }
在不使用任何命名空間時,需要如上面那樣寫一長串代碼;using A 的情況下,你還是得寫這麼一串。如果命名空間層次太多時,你要麼using到類所在的命名空間,要麼從頭寫起首碼。這太不智能了。希望可以正確的識別子命名空間。
using A.B;
class MyClass { C.OtherClass x; }
聲明:此篇文檔時來自於【狗刨學習網】社區-unity極致學院,是網友自行發布的Unity3D學習文章,如果有什麼內容侵犯了你的相關權益,請與官方溝通,我們會即時處理。
對 C# 未來的期望