引用:https://msdn.microsoft.com/zh-CN/library/0s21cwxk.aspx
“提取方法”是一項重構操作,提供了一種從現有成員中的代碼段創建新方法的便捷方式。
使用“提取方法”,可以通過從現有成員的代碼塊中提取一組代碼來創建新方法。提取出的新方法包含所選代碼,而現有成員中的所選代碼被替換為對新方法的調用。 通過將代碼段變為其自己的方法,可以快速而准確地重新組織代碼,以獲得更好的重用性和可靠性。
“提取方法”有以下優點:
通過強調離散的可重用方法鼓勵最佳的編碼做法。
鼓勵通過較好的組織獲得自記錄代碼。
當使用描述性名稱時,高級別方法可以像讀取一系列注釋一樣進行讀取。
鼓勵創建細化方法,以簡化重載。
減少代碼重復。
1、創建名為 ExtractMethod 的控制台應用程序,然後使用以下代碼示例替換 Program。
class A { const double PI = 3.141592; double CalculatePaintNeeded(double paintPerUnit, double radius) { // Select any of the following: // 1. The entire next line of code. // 2. The right-hand side of the next line of code. // 3. Just "PI *" of the right-hand side of the next line // of code (to see the prompt for selection expansion). // 4. All code within the method body. // ...Then invoke Extract Method. double area = PI * radius * radius; return area / paintPerUnit; } }
2、選擇您要提取的代碼片段:
double area = PI * radius * radius;
3、在“重構”菜單上,單擊“提取方法”。
出現“提取方法”對話框。
也可以鍵入鍵盤快捷鍵 Ctrl+R、Ctrl+M 來顯示“提取方法”對話框。
還可以右擊選定代碼,指向“重構”,然後單擊“提取方法”來顯示“提取方法”對話框。
4、在“新方法名稱”框中指定新方法的名稱,如 CircleArea。
新方法簽名的預覽顯示在“預覽方法簽名”下。
5、單擊“確定”
備注:
使用“提取方法”命令時,將在同一個類中的源成員之後插入新方法。
分部類型
如果類是分部類型,則“提取方法”將緊跟源成員之後生成新方法。 “提取方法”確定新方法的簽名,並在新方法中的代碼不引用實例數據時創建靜態方法。
泛型類型參數
當提取的方法具有不受約束的泛型類型參數時,除非已為該參數賦值,否則生成的代碼將不向該參數添加 ref 修飾符。 如果提取的方法將支持引用類型作為泛型類型實參,則應該向方法簽名中的形參手動添加 ref 修飾符。
匿名方法
如果嘗試提取匿名方法(該方法包括對在匿名方法之外聲明或引用的局部變量的引用)的一部分,則 Visual Studio 將警告您可能有語義更改。
當匿名方法使用局部變量的值時,將在執行匿名方法時獲取該值。 將匿名方法提取到其他方法中時,將在調用提取方法時獲取局部變量的值。
下面的示例闡釋這一語義更改。 如果執行此代碼,則將向控制台輸出 11。 如果使用“提取方法”將代碼注釋所標記的代碼區域提取到其自己的方法中,然後執行重構後的代碼,則將向控制台輸出 10。
class Program { delegate void D(); D d; static void Main(string[] args) { Program p = new Program(); int i = 10; /*begin extraction*/ p.d = delegate { Console.WriteLine(i++); }; /*end extraction*/ i++; p.d(); } }
若要解決此問題,請使匿名方法中使用的局部變量成為類的字段。