支援的程式碼變更 (C# 和 Visual Basic)

熱重新載入 (舊稱「編輯後繼續」) 可處理方法主體中大多數類型的程式碼變更。 但是在偵錯期間,無法套用方法主體外的變更和方法主體內的某些變更。 若要套用這些不支援的變更,您必須停止偵錯,然後使用新版程式碼重新啟動偵錯。

[編輯後繼續] 機制會處理方法主體內大多數程式碼的變更。 但是在偵錯期間,無法套用方法主體外的變更和方法主體內的某些變更。 若要套用這些不支援的變更,您必須停止偵錯,然後使用新版程式碼重新啟動偵錯。

支援的程式碼變更

下表顯示偵錯工作階段期間可能對 C# 和 Visual Basic 程式碼所做的變更,而不需重新開始工作階段。

語言元素或特性 支援的編輯作業 限制
類型 新增方法、欄位、建構函式等等
迭代器 新增或修改 No
async/await 運算式 新增或修改
動態物件 新增或修改 No
Lambda 運算式 新增或修改
LINQ 運算式 新增或修改 與 lambda 運算式相同
泛型 新增或修改
語言元素或特性 支援的編輯作業 限制
類型 新增方法、欄位、建構函式等等
迭代器 新增或修改 No
async/await 運算式 新增或修改
動態物件 新增或修改 No
Lambda 運算式 新增或修改
LINQ 運算式 新增或修改 與 lambda 運算式相同

注意

[編輯後繼續]通常支援較新的語言特性,例如字串插補和 Null 條件運算子。 如需最新的資訊,請參閱 Enc 支援的編輯頁面。

.NET 6+ 改進

.NET 6+ 和 Visual Studio 2022 和更新版本的改進功能包括支援更多類型的編輯,這超出舊版 Visual Studio 中原本可能的內容。 [熱重新載入] 和 [編輯和繼續] 體驗都可以使用這些改進功能。

.NET 6+ 熱重新載入體驗由「編輯後繼續」機制和 Roslyn 提供支援。 支援的編輯列出 Roslyn 目前支援的編輯類型,以及潛在的未來增強功能。

不支援的程式碼變更

在偵錯工作階段期間,不能將下列變更套用至 C# 和 Visual Basic 程式碼。

  • 變更目前的陳述式或任何其他使用中陳述式。

    使用中陳述式是呼叫堆疊上的函式中為了取得目前陳述式而呼叫的任何陳述式。

    目前的陳述式在來源視窗中會出現於黃色背景上。 其他使用中陳述式會出現於灰色背景上,而且是唯讀的。 這些預設色彩可以在 [選項] 對話方塊中進行變更。

  • 下表概述語言元素不支援的程式碼變更。

    語言元素或特性 不支援的編輯作業
    所有程式碼元素 重新命名
    命名空間
    命名空間、類型、成員 刪除
    介面 修改
    類型 新增抽象或虛擬成員、新增覆寫 (請參閱詳細資料)
    類型 新增解構函式
    成員 - 修改參考內嵌 Interop 類型的成員
    - 藉由執行程式碼來修改已經存取的靜態成員
    成員 (Visual Basic) - 使用 On Error 或 Resume 陳述式修改成員
    - 修改成員,包含 Aggregate、Group By、Simple Join 或 Group Join LINQ 查詢子句
    方法 - 修改簽章
    - 藉由新增方法主體,讓抽象方法變成非抽象
    - Delete 方法主體
    屬性 新增或修改
    事件或屬性 修改類型參數、基底類型、委派類型或傳回類型
    運算子或索引子 修改類型參數、基底類型、委派類型或傳回類型
    catch 區塊 包含使用中陳述式時修改
    try-catch-finally 區塊 包含使用中陳述式時修改
    Using 陳述式
    非同步方法/lambda 修改以 .NET Framework 4 和更低版本為目標的專案中的非同步方法/lambda (請參閱詳細資料)
    迭代器 修改以 .NET Framework 4 和更早版本為目標的專案中的迭代器 (請參閱詳細資料)
    語言元素或特性 不支援的編輯作業
    所有程式碼元素 重新命名
    命名空間
    命名空間、類型、成員 刪除
    泛型 新增或修改
    介面 修改
    類型 新增抽象或虛擬成員、新增覆寫 (請參閱詳細資料)
    類型 新增解構函式
    成員 - 修改參考內嵌 Interop 類型的成員
    - 藉由執行程式碼來修改已經存取的靜態成員
    成員 (Visual Basic) - 使用 On Error 或 Resume 陳述式修改成員
    - 修改成員,包含 Aggregate、Group By、Simple Join 或 Group Join LINQ 查詢子句
    方法 - 修改簽章
    - 藉由新增方法主體,讓抽象方法變成非抽象
    - Delete 方法主體
    屬性 新增或修改
    事件或屬性 修改類型參數、基底類型、委派類型或傳回類型
    運算子或索引子 修改類型參數、基底類型、委派類型或傳回類型
    catch 區塊 包含使用中陳述式時修改
    try-catch-finally 區塊 包含使用中陳述式時修改
    Using 陳述式
    非同步方法/lambda 修改以 .NET Framework 4 和更低版本為目標的專案中的非同步方法/lambda (請參閱詳細資料)
    迭代器 修改以 .NET Framework 4 和更早版本為目標的專案中的迭代器 (請參閱詳細資料)

Unsafe 程式碼

變更 Unsafe 程式碼的限制與變更 Safe 程式碼的限制相同,但前者多了以下這一項額外限制:[編輯後繼續] 不支援對包含 stackalloc 運算子之方法內的 Unsafe 程式碼進行變更。

應用程式支援

支援的應用程式包括:

  • Windows 10 或 Windows 11 中的 UWP 應用程式
  • 以 .NET Framework 4.6 傳統型或更新版本為目標的 x86 和 x64 應用程式 (.NET Framework 僅限傳統型版本)

對於 .NET 6 和更新版本,支援下列檔案類型的編輯:

  • .cshtml
  • .razor

不支援的應用程式、平台和作業

不支援的應用程式或平台包括:

  • F#
  • .NET Native
  • silverlight 5
  • Windows 8.1
  • Xamarin.Forms (iOS 和 Android)

對於 ASP.NET 和 ASP.NET Core,不支援下列檔案類型的編輯:

  • .aspx
  • .ascx
  • .aspx
  • .ascx
  • .cshtml
  • .razor

不支援的情節

[編輯後繼續] 無法用於下列偵錯案例中:

  • 混合模式 (原生/Managed) 偵錯。

  • 在 Arm64 上偵錯,不以 .NET 7 或更新版本為目標

  • 使用 COR_ENABLE_PROFILING 環境變數集進行偵錯。

  • 使用 [連結至處理序] 來偵錯應用程式 ([偵錯] > [連結至處程序]),而不是從 [偵錯] 功能表選擇 [開始] 來執行應用程式。 如果您想在連結至處理序時使用 [編輯後繼續],則必須先設定 COMPLUS_ForceENC 環境變數,才能啟動處理序 (set COMPLUS_ForceENC=1)。

  • 使用不具決定性的 (例如,以時間為基礎) 組件版本進行偵錯。 如果您想要使用 [編輯後繼續],請考慮只在發行 (或 CI) 組建中設定版本,並使版本在偵錯組建中保持不變。

  • 偵錯最佳化程式碼

  • SQL 偵錯

  • 對傾印檔偵錯。

  • 偵錯內嵌的執行階段應用程式。

  • 由於建置錯誤以致新版本建置失敗之後,對舊版程式碼進行偵錯。