程式碼變更如何對相容性造成影響

相容性是指在實作之 .NET 版本上編譯或執行程式碼的能力,而該版本與原先開發程式碼時所使用的 .NET 版本不同。 特定變更可能會造成六種不同的相容性影響:

行為變更

行為變更表示變更了成員的行為。 這類變更可能會外顯 (例如方法可能會擲回不同的例外狀況),也可能表示實作變更 (例如變更了傳回值的計算方式、新增或移除了內部方法呼叫,甚至是巨幅地改進了效能)。

當行為變更外顯,並修改了類型的公開合約之後,因為會影響二進位相容性,所以評估這類變更相當容易。 實作變更在評估上則更為困難;而根據變更的性質及 API 的使用頻率與模式,變更所造成的影響可能從嚴重到無害不等。

二進位相容性

二進位相容性是指 API 消費者無須重新編譯,就能在新版上使用 API 的能力。 諸如新增方法,或為類型新增介面實作一類的變更,都不會影響二進位相容性。 但若是移除或改變組件的公開特徵標記,致使消費者無法再存取組件公開的同一個介面,就會影響二進位相容性。 這類變更稱為二進位不相容變更

來源相容性

來源相容性是指現有 API 消費者無須變更原始程式碼,就能透過新版進行重新編譯的能力。 當消費者必須修原始程式碼,程式碼才能成功透過新版 API 進行建置時,就會發生來源不相容變更

設計階段相容性

設計階段相容性是指保留在不同版本 Visual Studio 及其他設計階段環境上之設計階段體驗的能力。 雖然這有可能會涉及設計工具的行為或 UI,但最攸關設計階段相容性的層面,則是專案相容性。 專案或解決方案必須能夠在新版的設計階段環境上開啟及使用。

回溯相容性

回溯相容性是指現有 API 消費者對新版執行時,仍能保有相同行為的能力。 行為變更與二進位相容性變更都會影響回溯相容性。 若消費者無法對新版執行,或對新版執行時,無法保有相同的行為,此 API 便是回溯不相容

我們建議不要進行會對回溯相容性造成影響的變更,因為開發人員預期新版 API 具備回溯相容性的能力。

往後相容性

往後相容性是指現有 API 消費者對舊版執行時,仍能保有相同行為的能力。 若消費者無法對舊版執行,或對舊版執行時,無法保有相同的行為,此 API 便是往後不相容

實際上,維護往後相容性可防止版本更迭時變更或新增,因為這些變更會造成使用新版的消費者無法在舊版中執行。 開發人員會預期使用新版 API 的消費者,在對舊版 API 執行時無法正常運作。

.NET Core 不會維護往後相容性。