引用:https://msdn.microsoft.com/zh-CN/library/0s21cwxk.aspx
“提取方法”是一項(xiàng)重構(gòu)操作,提供了一種從現(xiàn)有成員中的代碼段創(chuàng)建新方法的便捷方式。
使用“提取方法”,可以通過(guò)從現(xiàn)有成員的代碼塊中提取一組代碼來(lái)創(chuàng)建新方法。提取出的新方法包含所選代碼,而現(xiàn)有成員中的所選代碼被替換為對(duì)新方法的調(diào)用。 通過(guò)將代碼段變?yōu)槠渥约旱姆椒?,可以快速而?zhǔn)確地重新組織代碼,以獲得更好的重用性和可靠性。
“提取方法”有以下優(yōu)點(diǎn):
通過(guò)強(qiáng)調(diào)離散的可重用方法鼓勵(lì)最佳的編碼做法。
鼓勵(lì)通過(guò)較好的組織獲得自記錄代碼。
當(dāng)使用描述性名稱(chēng)時(shí),高級(jí)別方法可以像讀取一系列注釋一樣進(jìn)行讀取。
鼓勵(lì)創(chuàng)建細(xì)化方法,以簡(jiǎn)化重載。
減少代碼重復(fù)。
1、創(chuàng)建名為 ExtractMethod 的控制臺(tái)應(yīng)用程序,然后使用以下代碼示例替換 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、在“重構(gòu)”菜單上,單擊“提取方法”。
出現(xiàn)“提取方法”對(duì)話(huà)框。
也可以鍵入鍵盤(pán)快捷鍵 Ctrl+R、Ctrl+M 來(lái)顯示“提取方法”對(duì)話(huà)框。
還可以右擊選定代碼,指向“重構(gòu)”,然后單擊“提取方法”來(lái)顯示“提取方法”對(duì)話(huà)框。
4、在“新方法名稱(chēng)”框中指定新方法的名稱(chēng),如 CircleArea。
新方法簽名的預(yù)覽顯示在“預(yù)覽方法簽名”下。
5、單擊“確定”
備注:
使用“提取方法”命令時(shí),將在同一個(gè)類(lèi)中的源成員之后插入新方法。
分部類(lèi)型
如果類(lèi)是分部類(lèi)型,則“提取方法”將緊跟源成員之后生成新方法。 “提取方法”確定新方法的簽名,并在新方法中的代碼不引用實(shí)例數(shù)據(jù)時(shí)創(chuàng)建靜態(tài)方法。
泛型類(lèi)型參數(shù)
當(dāng)提取的方法具有不受約束的泛型類(lèi)型參數(shù)時(shí),除非已為該參數(shù)賦值,否則生成的代碼將不向該參數(shù)添加 ref 修飾符。 如果提取的方法將支持引用類(lèi)型作為泛型類(lèi)型實(shí)參,則應(yīng)該向方法簽名中的形參手動(dòng)添加 ref 修飾符。
匿名方法
如果嘗試提取匿名方法(該方法包括對(duì)在匿名方法之外聲明或引用的局部變量的引用)的一部分,則 Visual Studio 將警告您可能有語(yǔ)義更改。
當(dāng)匿名方法使用局部變量的值時(shí),將在執(zhí)行匿名方法時(shí)獲取該值。 將匿名方法提取到其他方法中時(shí),將在調(diào)用提取方法時(shí)獲取局部變量的值。
下面的示例闡釋這一語(yǔ)義更改。 如果執(zhí)行此代碼,則將向控制臺(tái)輸出 11。 如果使用“提取方法”將代碼注釋所標(biāo)記的代碼區(qū)域提取到其自己的方法中,然后執(zhí)行重構(gòu)后的代碼,則將向控制臺(tái)輸出 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(); }}
若要解決此問(wèn)題,請(qǐng)使匿名方法中使用的局部變量成為類(lèi)的字段。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注