1. 程式人生 > >Unity 5.3.5p8 C#編譯器升級

Unity 5.3.5p8 C#編譯器升級

Unity 5.3.5p8的C#編譯器升級

注意:該版本是單獨升級C#編譯器的測試版!請使用文中提供的下載連結!

基於Unity 5.3.5p8的C#編譯器升級!下載連結

新升級的Mono C#編譯器(對應Mono 4.4)將用於編譯所有的C#指令碼。

重要注意事項

Unity編輯器及播放器所使用的Mono執行時還未升級。
新編譯器仍針對C# 4。是舊的編譯器也支援的版本。
新編譯器目標框架為.Net 3.5,也是之前支援的框架。

這只是升級Mono/.Net邁出的第一步。

FAQ

對現有專案有何影響?

該升級應該能夠“正常工作”,它並未新增任何新功能。不會對現有專案帶來任何影響,還有些小益處。新的Mono和C#編譯器與之前相比執行速度普遍更快,而且修復了多年以來的Bug。

有什麼需要注意的?

理論上有可能在執行時產生奇怪的問題。但我們自己測試的過程中並未發現。

大多數情況下都會在編譯時發現問題。目前為止我們遇到的情況有:
有些無效的C#程式碼是舊的編譯器允許但新的編譯器會報錯的
涉及到編譯器特定屬性(安裝目錄、名稱等)的程式碼或外掛會出錯

另外,如果你經常使用MonoDevelop或VSTU(Visual Studio Tools for Unity)除錯C#程式碼,那歡迎向我們反饋你遇到的任何問題。編譯器輸出結果應該是一致的,但偵錯程式可能對於某些生成的程式碼模式會很敏感。

有什麼重大變化嗎?

新編譯器有一處已知的重大變化,就是閉包獲取foreach變數的方式,這是由C#語言團隊做出的改變。也就是說,如下程式碼將輸出“b a r”而非目前的“r r r”:

var actions = new Action[3];
var j = 0;
foreach (var c in "bar")
   actions[j++] = () => Console.WriteLine(c);
         
foreach (var a in actions)       
    a();

使用較新的VS或Mono均會得到這樣的結果,這也是目前WSA平臺所表現的行為,具體細節請看:

是否修復了“foreach”記憶體分配的問題?

某些情況下是的,問題描述請看:

對Array、List、Dictionary或HashSet做“foreach”遍歷是不會分配記憶體的。

為何不面向C# 5或C# 6?

第一步我們希望先推出新的編譯器。未來再啟用新的C#特性。

支援C#語言新特性面臨的幾個問題:
目前的生態系統不能完全把控新的C#(指令碼更新器、偵錯程式、特定的MonoDevelop/VisualStudio版本)
目前仍以舊的.Net 3.5為目標框架。在舊框架上支援新的C#或多或少會導致些迷惑。從頭開始編寫所有程式碼也許可行,但對於已有程式碼來說可能需要C#語言和框架都是最新才可以。

資料文獻