引用:https://msdn.microsoft.com/zh-CN/library/0s21cwxk.aspxide
「提取方法」是一項重構操做,提供了一種從現有成員中的代碼段建立新方法的便捷方式。編碼
使用「提取方法」,能夠經過從現有成員的代碼塊中提取一組代碼來建立新方法。提取出的新方法包含所選代碼,而現有成員中的所選代碼被替換爲對新方法的調用。 經過將代碼段變爲其本身的方法,能夠快速而準確地從新組織代碼,以得到更好的重用性和可靠性。spa
「提取方法」有如下優勢:code
經過強調離散的可重用方法鼓勵最佳的編碼作法。blog
鼓勵經過較好的組織得到自記錄代碼。get
當使用描述性名稱時,高級別方法能夠像讀取一系列註釋同樣進行讀取。string
鼓勵建立細化方法,以簡化重載。it
減小代碼重複。io
一、建立名爲 ExtractMethod 的控制檯應用程序,而後使用如下代碼示例替換 Program。class
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; } }
二、選擇您要提取的代碼片斷:
double area = PI * radius * radius;
三、在「重構」菜單上,單擊「提取方法」。
出現「提取方法」對話框。
也能夠鍵入鍵盤快捷鍵 Ctrl+R、Ctrl+M 來顯示「提取方法」對話框。
還能夠右擊選定代碼,指向「重構」,而後單擊「提取方法」來顯示「提取方法」對話框。
四、在「新方法名稱」框中指定新方法的名稱,如 CircleArea。
新方法簽名的預覽顯示在「預覽方法簽名」下。
五、單擊「肯定」
備註:
使用「提取方法」命令時,將在同一個類中的源成員以後插入新方法。
分部類型
若是類是分部類型,則「提取方法」將緊跟源成員以後生成新方法。 「提取方法」肯定新方法的簽名,並在新方法中的代碼不引用實例數據時建立靜態方法。
泛型類型參數
當提取的方法具備不受約束的泛型類型參數時,除非已爲該參數賦值,不然生成的代碼將不向該參數添加 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(); } }
若要解決此問題,請使匿名方法中使用的局部變量成爲類的字段。