13.版本處理
解決版本問題已成為.NET框架一個主要考慮。這些考慮的大多數都體現於組合體中。在C#中,可在同一個進程裡運行同一個組合體的不同版本的能力是令人印象深刻的。
當代碼的新版本(尤其是.NET庫)被創建時,C#可以防止軟件失敗。C#語言參考裡詳細地描述了該問題。我用一個例子簡明扼要地講解如下:
在Java中,假定我們部署一個稱為D的類,它是從一個通過VM發布的叫B的類派生下來的。類D有一個叫foo的方法,而它在B發布時,B還沒有這個方法。後來,對類B做了個升級,現在B包括了一個叫foo的方法,新的VM現在安裝在使用類D的機器上了。現在,使用D的軟件可能會發生故障了,因為類B的新實現可能會導致一個對D的虛函數調用,這就執行了一個類B始料未及的動作。【譯注:因Java中方法缺省是虛的】在C#中,類D的foo方法應該聲明為不用override修飾符的(這個真正表達了程序員的意願),因此,運行時知道讓類D的foo方法隱藏類B的foo方法,而不是重載它。
引用C#參考手冊的一句有意思的話“C#處理版本問題是通過需要開發人員明確他們的意圖來實現的”。盡管使用override是一個表達意圖的辦法,但編譯器也能自動生成—通過在編譯時檢查方法是否在執行(而不是聲明)一個重載。這就意味著,你仍然能夠擁有象Java一樣的語言(Java不用virtual和override關鍵字),並且仍然能夠正確處理版本問題。
參見字段修飾符部分。