程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 提取方法重構,

C# 提取方法重構,

編輯:C#入門知識

C# 提取方法重構,


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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved