重新命名重構 (C#)
[重新命名] 是 Visual Studio 整合式開發環境 (IDE) 中的重構功能,提供將欄位、區域變數、方法、命名空間 (Namespace)、屬性及型別等程式碼符號之識別項重新命名的簡單方式。 [重新命名] 可以用來變更註解和字串中的名稱,並可變更識別項的宣告和呼叫。
注意事項 |
---|
當使用 Visual Studio 的原始檔控制時,請在嘗試執行重新命名重構之前,先取得最新版本的原始檔。 |
您可以從下列 Visual Studio 功能中使用重新命名重構:
功能 |
IDE 中的重構行為 |
---|---|
程式碼編輯器 |
在程式碼編輯器中,將游標置於某些型別的程式碼符號上,即可使用重新命名重構。 當游標位於這個位置時,您可以輸入鍵盤快速鍵以叫用 重新命名 命令(CTRL + R、CTRL + R,),或者 重新命名 命令從某個智慧標籤、捷徑功能表或 重構 功能表。 |
類別檢視 |
當您在 [類別檢視] 中選取識別項時,即可從捷徑功能表和 [重構] 功能表使用重新命名重構。 |
物件瀏覽器 |
當您在物件瀏覽器中選取識別項時,只能從 [重構] 功能表使用重新命名重構。 |
Windows Form 設計工具的屬性方格 |
在 Windows Form 設計工具的 [屬性方格] 中,變更控制項的名稱會起始該控制項的重新命名作業。 不過 [重新命名] 對話方塊不會出現。 |
方案總管 |
在 [方案總管] 中,可從捷徑功能表使用 [重新命名] 命令。 如果選取的原始程式檔包含的類別,其名稱與檔名相同,您就可以使用這個命令同步重新命名原始程式檔並執行重新命名重構。 例如,如果您建立了預設的 Windows 應用程式,然後將 Form1.cs 重新命名為 TestForm.cs,則原始程式檔名 Form1.cs 將變更為 TestForm.cs,而類別 Form1 及該類別的所有參考都會重新命名為 TestForm。
注意事項
[復原] 命令 (CTRL+Z) 只會復原程式碼中的重新命名重構,而不會將檔名改回原始名稱。
如果選取的原始程式檔未包含名稱與檔名相同的類別,則 [方案總管] 中的 [重新命名] 命令只會重新命名原始程式檔,而不會執行重新命名重構。 |
重新命名作業
當您執行 [重新命名] 時,重構引擎會對各程式碼符號執行重新命名作業,如下表所述。
程式碼符號 |
重新命名作業 |
---|---|
欄位 |
將宣告和所有使用的欄位變更為新的名稱。 |
區域變數 |
將變數的宣告及出現的地方變更為新名稱。 |
方法 |
將方法的名稱和該方法的所有參考變更為新的名稱。
注意事項
當您重新命名擴充方法時,無論是使用擴充方法做為靜態方法或執行個體方法 (Instance Method),重新命名作業都會傳送到該方法在範圍內的所有執行個體。如需詳細資訊,請參閱擴充方法 (C# 程式設計手冊)。
|
命名空間 |
在宣告、所有的 using 陳述式 (Statement) 和完整名稱中,將命名空間的名稱都變更為新的名稱。
注意事項
將命名空間重新命名時,Visual Studio 也會更新 [專案設計工具] 之 [應用程式] 頁上的 [預設命名空間] 屬性。這個屬性無法藉由在 [編輯] 功能表上選取 [復原] 來重設。若要重設 [預設命名空間] 屬性值,您必須在 [專案設計工具] 中修改此屬性。如需詳細資訊,請參閱應用程式頁。
|
屬性 |
將屬性的宣告及出現的地方變更為新名稱。 |
型別 |
將型別的所有宣告和所有出現的地方變更為新名稱,包括建構函式 (Constructor) 和解構函式 (Destructor)。 至於部分型別,重新命名作業會將所有部分一起變更。 |
若要重新命名識別項
建立名為 RenameIdentifier 的主控台應用程式,再以下列程式碼取代 Program。
class ProtoClassA { // Invoke on 'MethodB'. public void MethodB(int i, bool b) { } } class ProtoClassC { void D() { ProtoClassA MyClassA = new ProtoClassA(); // Invoke on 'MethodB'. MyClassA.MethodB(0, false); } }
將游標放在 MethodB 上,可以放在方法宣告或方法呼叫中。
從 [重構] 功能表中選取 [重新命名]。 [重新命名] 對話方塊隨即出現。
您也可以以滑鼠右鍵按一下資料指標,指向內容功能表上的 [重構],然後按一下 [重新命名],顯示 [重新命名] 對話方塊。
在 [新名稱] 欄位中輸入 MethodC。
選取 [在註解中搜尋] 核取方塊。
按一下 [確定]。
在 [預覽變更] 對話方塊中,按一下 [套用]。
若要使用智慧標籤重新命名識別項
建立名為 RenameIdentifier 的主控台應用程式,再以下列程式碼取代 Program。
class ProtoClassA { // Invoke on 'MethodB'. public void MethodB(int i, bool b) { } } class ProtoClassC { void D() { ProtoClassA MyClassA = new ProtoClassA(); // Invoke on 'MethodB'. MyClassA.MethodB(0, false); } }
在 MethodB 的宣告中,輸入或按退格鍵刪除方法識別項。 智慧標籤提示將會出現在這個識別項下方。
注意事項 您只能在識別項的宣告中,使用智慧標籤叫用重新命名重構。
輸入鍵盤快速鍵 SHIFT+ALT+F10,然後按向下鍵 (DOWN ARROW) 顯示智慧標籤功能表。
-或-
將滑鼠指標移到智慧標籤提示上方,以顯示智慧標籤。 然後將滑鼠指標移到智慧標籤上方,並按一下向下鍵,顯示智慧標籤功能表。
選取 [重新命名 '<identifer1>' 為 '<identifier2>'] 功能表項目叫用重新命名重構,而不預覽程式碼的變更。 所有 <identifer1> 的參考都會自動更新為 <identifier2>。
-或-
選取 [使用預覽重新命名] 功能表項目叫用重新命名重構,並預覽程式碼的變更。 [預覽變更] 對話方塊便會出現。
備註
重新命名實作或覆寫的成員
若您 [重新命名] 的成員會實作/覆寫其他型別的成員,或會遭到其他型別的成員實作/覆寫,Visual Studio 就會顯示對話方塊,說明此重新命名作業將導致一系列更新。 如果您按一下 [繼續],重構引擎便會在基底型別和衍生型別中,遞迴地尋找並重新命名與所重新命名的成員之間具有實作/覆寫關聯性的所有成員。
下列程式碼範例中包含具有實作/覆寫關聯性的成員。
interface IBase
{
void Method();
}
public class Base
{
public void Method()
{ }
public virtual void Method(int i)
{ }
}
public class Derived : Base, IBase
{
public new void Method()
{ }
public override void Method(int i)
{ }
}
public class C : IBase
{
public void Method()
{ }
}
在上述範例中,由於 C.Method() 實作 Ibase.Method(),重新命名 C.Method() 也會重新命名 Ibase.Method()。 接下來,重構引擎遞迴地發現 Ibase.Method() 是由 Derived.Method() 實作,所以重新命名 Derived.Method()。 重構引擎不會重新命名 Base.Method(),因為 Derived.Method() 並不會覆寫 Base.Method()。 重構引擎會在此停止,除非 [重新命名 ] 對話方塊中已核取 [重新命名多載]。
如果已核取 [重新命名多載],則重構引擎會重新命名 Derived.Method(int i) 因為它多載 Derived.Method(),重新命名 Base.Method(int i) 因為它遭到 Derived.Method(int i) 多載,並重新命名 Base.Method() 因為它是 Base.Method(int i) 的多載。
注意事項 |
---|
當您重新命名於參考組件 (Assembly) 中定義的成員時,會出現對話方塊,說明此重新命名將造成建置 (Build) 錯誤。 |
重新命名匿名型別的屬性
當您重新命名匿名型別中的屬性時,重新命名作業將會傳送到具有相同屬性之其他匿名型別中的屬性。 下列範例會說明這項行為。
var a = new { ID = 1};
var b = new { ID = 2};
在上述程式碼中,由於兩個陳述式都具有相同的基礎匿名型別,重新命名 ID 將會在兩個陳述式中都變更 ID。
var companyIDs =
from c in companylist
select new { ID = c.ID, Name = c.Name};
var orderIDs =
from o in orderlist
select new { ID = o.ID, Item = o.Name};
在上述程式碼中,由於 companyIDs 和 orderIDs 沒有相同的屬性,重新命名 ID 將只會重新命名一個 ID 的執行個體。