適用於 C# 開發人員的版本和更新考量

將新功能新增至 C# 語言時,相容性是非常重要的目標。 在幾乎所有情況下,現有程式碼可以使用新的編譯器版本重新編譯,不會有任何問題。 .NET 執行階段小組也有目標,以確保更新程式庫的相容性。 在幾乎所有情況下,當您從更新的執行階段使用更新的程式庫啟動應用程式時,行為與舊版完全相同。

用來編譯應用程式的語言版本通常符合專案中參考的執行階段目標 Framework Moniker (TFM)。 如需變更默預設語言版本的詳細資訊,請參閱標題為 設定語言版本 一文。 此預設行為可確保最大的相容性。

引進重大變更時,會分類為:

  • 二進位中斷性變更: 二進位中斷性變更會在使用新的執行階段啟動時,在應用程式或程式庫中造成不同的行為,包括可能當機。 您必須重新編譯您的應用程式,才能納入這些變更。 現有的二進位無法正常運作。
  • 來源中斷性變更: 來源中斷性變更會變更原始程式碼的意義。 您需要先進行原始程式碼編輯,再使用最新語言版本編譯應用程式。 您現有的二進位將會使用較新的主機和執行階段正確執行。 請注意,針對語言語法,來源中斷性變更也是行為變更,如執行階段中斷性變更中所定義。

當二進位中斷性變更影響您的應用程式時,您必須重新編譯您的應用程式,但不需要編輯任何原始程式碼。 當來源中斷性變更影響您的應用程式時,現有的二進位仍會在具有更新的執行階段和程式庫的環境中正確執行。 不過,您必須進行來源變更,才能使用新的語言版本和執行階段重新編譯。 如果變更同時是來源中斷和二進位中斷,您必須使用最新版本重新編譯應用程式,並進行來源更新。

由於 C# 語言小組和執行階段小組為了避免重大變更的目標,更新您的應用程式通常意味著更新 TFM 並重建應用程式。 不過,對於公開散發的程式庫,您應該仔細評估原則,以取得支援的 TFM 和支持的語言版本。 您可能會使用最新版本中的功能來建立新程式庫,並需要確保使用舊版編譯器建置的應用程式可以使用它。 或者您可能升級了現有的程式庫,但是您的許多使用者都還沒有升級的版本。

引進程式庫的中斷性變更

當您在程式庫的公用 API 中採用新的語言功能時,應該評估採用此功能是否為程式庫的使用者引進二進位或來源中斷性變更。 未出現在 publicprotected 介面中之內部實作的任何變更都相容。

注意

如果您使用 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 進行平行組建。
  • 您可以考慮多重目標。