相容性是一個重要目標,因為新功能會新增至 C# 語言。 在幾乎所有情況下,現有的程式代碼都可以使用新的編譯程式版本重新編譯,而沒有任何問題。 .NET 運行時間小組也有目標,以確保更新連結庫的相容性。 在幾乎所有情況下,當您的應用程式從更新的運行時間使用更新的連結庫啟動時,行為與舊版完全相同。
用來編譯應用程式的語言版本通常符合專案中參考的運行時間目標架構Moniker(TFM)。 如需變更默認語言版本的詳細資訊,請參閱標題為 設定語言版本的文章。 此預設行為可確保最大的相容性。
引進 重大變更 時,會分類為:
- 二進位中斷性變更:二進位中斷性變更會在使用新的運行時間啟動時,在應用程式或連結庫中造成不同的行為,包括可能當機。 您必須重新編譯您的應用程式,才能納入這些變更。 現有的二進位檔無法正常運作。
- 來源中斷性變更:來源中斷性變更會變更原始程式碼的意義。 您需要先進行原始程式碼編輯,再使用最新版本編譯應用程式。 您現有的二進位檔將會使用較新的主機和運行時間正確執行。 請注意,針對語言語法, 來源中斷性變更 也是 行為變更,如 運行時間中斷性變更中所定義。
當二進位中斷性變更影響您的應用程式時,您必須重新編譯您的應用程式,但不需要編輯任何原始程式碼。 當來源中斷性變更影響您的應用程式時,現有的二進位檔仍會在具有更新的運行時間和連結庫的環境中正確執行。 不過,您必須進行來源變更,才能使用新的語言版本和運行時間重新編譯。 如果變更同時是來源中斷和二進位中斷,您必須使用最新版本重新編譯應用程式,並進行來源更新。
由於 C# 語言小組和運行時間小組為了避免重大變更的目標,更新您的應用程式通常是更新 TFM 並重建應用程式的問題。 不過,對於公開散發的連結庫,您應該仔細評估原則,以取得支援的TFM和支持的語言版本。 您可能會建立新的連結庫,其中包含最新版本中找到的功能,並且需要確保使用舊版編譯程式建置的應用程式可以使用它。 或者,您可能正在升級現有的連結庫,而且您的許多使用者可能尚未升級版本。
介紹連結庫中的重大變更
當您在連結庫的公用 API 中採用新的語言功能時,應該評估採用此功能是否為連結庫的使用者引進二進位或來源中斷性變更。 未出現在 public 或 protected 介面中之內部實作的任何變更都相容。
備註
如果您使用 System.Runtime.CompilerServices.InternalsVisibleToAttribute 來啟用類型來查看內部成員,內部成員可能會引入重大變更。
二進位重大變更需要您的使用者重新編譯其程序代碼,才能使用新版本。 例如,請考慮此公用方法:
public double CalculateSquare(double value) => value * value;
如果您將 in 修飾詞新增至 方法,這是二進位重大變更:
public double CalculateSquare(in double value) => value * value;
用戶必須重新編譯使用 CalculateSquare 方法讓新連結庫正常運作的任何應用程式。
來源重大變更需要您的使用者在重新編譯之前變更其程序代碼。 例如,請考慮此類型:
public class Person
{
public string FirstName { get; }
public string LastName { get; }
public Person(string firstName, string lastName) => (FirstName, LastName) = (firstName, lastName);
// other details omitted
}
在較新版本中,您想要利用針對 record 類型產生的合成成員。 您可以進行下列變更:
public record class Person(string FirstName, string LastName);
先前的變更需要針對衍生自 Person的任何類型進行變更。 所有這些宣告都必須將 修飾詞新增 record 至其宣告。
重大變更的影響
當您將 二進位中斷性變更 新增至連結庫時,會強制使用連結庫重新編譯的所有專案。 不過,這些專案中沒有任何原始程式碼需要變更。 因此,對於每個專案而言,重大變更的影響相當小。
當您對連結庫進行 重大變更時 ,您需要所有專案進行來源變更,才能使用新的連結庫。 如果需要變更需要新的語言功能,您可以強制這些項目升級至您現在所使用的相同語言版本和 TFM。 您必須為使用者提供更多工作,並可能強制他們升級。
您所做的任何重大變更的影響取決於相依於連結庫的項目數目。 如果您的連結庫是由一些應用程式在內部使用,您可以回應所有受影響專案中的任何重大變更。 不過,如果您的連結庫已公開下載,您應該評估潛在影響並考慮替代方法:
- 您可以新增平行處理現有 API 的新 API。
- 您可以考慮針對不同的TFM進行平行建置。
- 您可能會考慮多重目標。