Unity 5.3.5p8的C#編譯器升級
注意:該版本是單獨升級C#編譯器的測試版!請使用文中提供的下載鏈接!
基於Unity 5.3.5p8的C#編譯器升級!下載鏈接
試用該版本前請先備份項目,遇到任何問題請及時反饋到Unity官方中文社區(http://forum.china.unity3d.com/)。
新升級的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平台所表現的行為,具體細節請看:
https://msdn.microsoft.com/en-us/library/hh678682(v=vs.110).aspx
是否修復了“foreach”內存分配的問題?
某些情況下是的,問題描述請看:
http://stackoverflow.com/questions/18552669/memory-allocation-when-using-foreach-loops-in-c-sharp
對Array、List
為何不面向C# 5或C# 6?
第一步我們希望先推出新的編譯器。未來再啟用新的C#特性。
支持C#語言新特性面臨的幾個問題:
目前的生態系統不能完全把控新的C#(腳本更新器、調試器、特定的MonoDevelop/VisualStudio版本)
目前仍以舊的.Net 3.5為目標框架。在舊框架上支持新的C#或多或少會導致些迷惑。從頭開始編寫所有代碼也許可行,但對於已有代碼來說可能需要C#語言和框架都是最新才可以。