C# 提取方法重構

引用: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();
    }
}

若要解決此問題,請使匿名方法中使用的局部變量成爲類的字段。

相關文章
相關標籤/搜索