65.9K
CodeProject 正在变化。 阅读更多。
Home

Visual Studio 2015 中的重命名助手

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (14投票s)

2016 年 5 月 9 日

CPOL

9分钟阅读

viewsIcon

26367

downloadIcon

348

Visual Studio 2015 中的重命名助手

引言

在本系列文章的这一部分,我们将介绍 Visual Studio 2015 中的重命名主题。是的,Visual Studio 2015 提供了强大的代码重构/重命名功能。它可以帮助开发人员根据开发或最佳实践的需求来优化和重构代码。此功能通过提供重构建议以及帮助修复和优化代码,使开发人员能够遵循最佳实践。在处理大型代码库时,重命名变量、方法、属性、类甚至项目一直以来都是开发人员面临的挑战。大多数开发人员面临的另一个挑战是代码注释和编写优化的方法。Visual Studio 2015 以一种非常简单友好的方式帮助进行代码重构和重命名。

学习 Visual Studio 2015 系列

代码重命名

Visual Studio 2015 中的这项重命名功能涵盖了许多特性。例如:更改预览、内联和无模式重命名窗口、即时重命名、检测和解决冲突、重命名代码注释等等。让我们通过实际示例详细讨论每一个。我正在使用 Visual Studio 2015 企业版,并创建了一个名为 VS2015ConsoleApplication 的控制台应用程序,其中包含一个名为 IProducts 的接口和一个实现该接口的名为 MyProducts 的类。IProducts 包含两个方法,一个根据产品代码返回产品,另一个返回产品列表。Product.cs 是另一个包含 Product 实体的类。该类充当传输对象或实体。我们将使用 Program.cs 类的 Main 方法来调用 MyProducts 类的方法。

IProducts

 

 1: using System; 
 2: using System.Collections.Generic; 
 3: using System.Linq; 
 4: using System.Text; 
 5: using System.Threading.Tasks; 
 6: 
 7: namespace VS2015ConsoleApplication 
 8: { 
 9: interface IProducts 
 10: 
     { 
 11:    Product GetProduct(string productCode); 
 12:    List<product> GetProductList(); 
 13: } 
 14: }
 

 

产品

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading.Tasks;
   6:  
   7: namespace VS2015ConsoleApplication
   8: {
   9:     public class Product
  10:     {
  11:         public string ProductName { get; set; }
  12:         public string ProductCode { get; set; }
  13:         public string ProductPrice { get; set; }
  14:         public string ProductType { get; set; }
  15:         public string ProductDescription { get; set; }
  16:  
  17:     }
  18: }

MyProducts

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading.Tasks;
   6:  
   7: namespace VS2015ConsoleApplication
   8: {
   9:     public class MyProducts :IProducts
  10:     {
  11:         List<product> _productList = new List<product>();
  12:         public MyProducts()
  13:         {
  14:             _productList.Add(new Product {ProductCode="0001",ProductName="IPhone",
		  ProductPrice="60000",ProductType="Phone",ProductDescription="Apple IPhone" } );
  15:             _productList.Add(new Product { ProductCode = "0002", ProductName = "Canvas", 
		  ProductPrice = "20000", ProductType = "Phone", ProductDescription = "Micromax phone" });
  16:             _productList.Add(new Product { ProductCode = "0003", ProductName = "IPad", 
		  ProductPrice = "30000", ProductType = "Tab", ProductDescription = "Apple IPad" });
  17:             _productList.Add(new Product { ProductCode = "0004", ProductName = "Nexus", 
		  ProductPrice = "30000", ProductType = "Phone", ProductDescription = "Google Phone" });
  18:             _productList.Add(new Product { ProductCode = "0005", ProductName = "S6", 
		  ProductPrice = "40000", ProductType = "Phone", ProductDescription = "Samsung phone" });
  19:  
  20:         }
  21:  
  22:         public Product GetProduct(string productCode)
  23:         {
  24:             return _productList.Find(p => p.ProductCode == productCode);
  25:         }
  26:  
  27:         public List<product> GetProductList()
  28:         {
  29:             return _productList;
  30:         }
  31:     }
  32: }

Program.cs

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading.Tasks;
   6:  
   7: namespace VS2015ConsoleApplication
   8: {
   9:     class Program
  10:     {
  11:         static void Main()
  12:         {
  13:             var myProducts = new MyProducts();
  14:             Console.WriteLine( String.Format("Product with code 0002 is : {0}", 
					myProducts.GetProduct("0002").ProductName));
  15:             Console.WriteLine(Environment.NewLine);
  16:             var productList = myProducts.GetProductList();
  17:             Console.WriteLine("Following are all the products");
  18:  
  19:             foreach (var product in productList)
  20:             {
  21:                 Console.WriteLine(product.ProductName);
  22:             }
  23:             Console.ReadLine();
  24:         }
  25:     }
  26: }

我们的代码已准备就绪。Program.cs 文件的 main 方法从 MyProducts 类调用两个接口方法来测试功能。

我们将使用这个代码库来学习代码重命名功能。重命名体验可能因正在执行的实际操作而异。例如,在 MyProducts 类中,我们将 _productList 作为一个变量,用于存储所有产品列表,并且该变量在类中被广泛使用。

让我们尝试将此变量重命名为 _allProducts

请注意,一旦 _productsList 被更改为 _allProduct,更改的变量名周围就会出现一个虚线框,并且左侧会出现一个灯泡图标。您还可以看到另一个变化:所有使用 _productList 的地方下方都显示了一条红线。这意味着所有这些实例都应相应地进行更改。您可以在此处看到 Visual Studio 的强大之处。Visual Studio 足够智能,能够理解并传达开发人员所做的更改需要在其他地方反映出来。让我们看看灯泡图标会显示什么。单击左边距出现的灯泡图标。

灯泡图标显示了一些建议,这些建议是我们在本系列文章的第 1 天和第 2 天中学到的。灯泡图标现在显示了一个新的建议,即“重命名”。在建议窗口中,灯泡图标会突出显示所有 _productList 的实例,并建议将所有实例重命名为新名称,即 _allProducts。当您通过单击建议窗口底部的“预览更改”链接预览更改时,它会显示变量重命名后您将获得的最终更改。

在预览中,您可以清楚地看到变量重命名后将发生的更改。让我们单击应用更改,您将看到该方法在所有实例中都有了一个新更改的变量。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading.Tasks;
   6:  
   7: namespace VS2015ConsoleApplication
   8: {
   9:     public class MyProducts :IProducts
  10:     {
  11:         List<product> _allProduct = new List<product>();
  12:         public MyProducts()
  13:         {
  14:             _allProduct.Add(new Product {ProductCode="0001",ProductName="IPhone",
		  ProductPrice="60000",ProductType="Phone",ProductDescription="Apple IPhone" } );
  15:             _allProduct.Add(new Product { ProductCode = "0002", ProductName = "Canvas", 
		  ProductPrice = "20000", ProductType = "Phone", ProductDescription = "Micromax phone" });
  16:             _allProduct.Add(new Product { ProductCode = "0003", ProductName = "IPad", 
		  ProductPrice = "30000", ProductType = "Tab", ProductDescription = "Apple IPad" });
  17:             _allProduct.Add(new Product { ProductCode = "0004", ProductName = "Nexus", 
		  ProductPrice = "30000", ProductType = "Phone", ProductDescription = "Google Phone" });
  18:             _allProduct.Add(new Product { ProductCode = "0005", ProductName = "S6", 
		  ProductPrice = "40000", ProductType = "Phone", ProductDescription = "Samsung phone" });
  19:  
  20:         }
  21:  
  22:         public Product GetProduct(string productCode)
  23:         {
  24:             return _allProduct.Find(p => p.ProductCode == productCode);
  25:         }
  26:  
  27:         public List<product> GetProductList()
  28:         {
  29:             return _allProduct;
  30:         }
  31:     }
  32: }

现在让我们运行应用程序,检查更改是否对应用程序的功能产生了影响。按 F5。

可以清楚地看到应用程序没有生成错误,并且产生的结果与以前相同。开发人员需要注意一点,重命名有时在大型代码库中可能具有风险且棘手,因此在重命名时,建议大致看一下建议窗口提供的预览。

让我们来看另一个场景。打开 Program.cs 文件,并对 myProducts 对象执行重命名操作。

这次,我们将通过上下文菜单进行重命名。右键单击 myProducts 对象名称,您将看到上下文菜单打开。在打开的上下文菜单中有一个重命名选项。

在“重命名”选项旁边,还有一个快捷方式,即 Ctrl+R, Ctrl+R。当您选择“重命名”时,您会注意到这里的重命名体验不同,所有重命名实例都会被突出显示。代码窗口的右角会出现一个新的窗口,其中包含其他一些选项。现在,如果您重命名对象名称,其他突出显示的变量会在输入时即时重命名。要关闭重命名窗口,您可以单击窗口上的交叉按钮。请注意,通过上下文菜单进行重命名此选项比之前的选项要快得多,并且可以让您一步完成即时重命名,同时在输入时进行实时预览。一旦变量被重命名并关闭窗口,所有突出显示都会消失,您将在所有出现的地方获得一个干净的重命名变量。

我将对象名称从 myProducts 改为了 products

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading.Tasks;
   6:  
   7: namespace VS2015ConsoleApplication
   8: {
   9:     class Program
  10:     {
  11:         static void Main()
  12:         {
  13:             var myProducts = new MyProducts();
  14:             Console.WriteLine( String.Format("Product with code 0002 is : {0}", 
					myProducts.GetProduct("0002").ProductName));
  15:             Console.WriteLine(Environment.NewLine);
  16:             var productList = myProducts.GetProductList();
  17:             Console.WriteLine("Following are all the products");
  18:  
  19:             foreach (var product in productList)
  20:             {
  21:                 Console.WriteLine(product.ProductName);
  22:             }
  23:             Console.ReadLine();
  24:         }
  25:     }
  26: }

重命名冲突

让我们来看另一个场景,我们尝试将一个变量重命名为在同一方法中已分配给任何其他变量的名称,或者尝试重命名一个属性,该属性的类中已有一个同名属性。让我们以 Product 类为例。Product 类包含 Product 属性,让我们尝试重命名 ProductName 属性。右键单击 ProductName 属性,然后通过从上下文菜单中单击“重命名”来打开“重命名”窗口。

我们将 ProductName 属性的名称更改为 ProductCode。此类中已有一个 ProductCode 属性。让我们看看会发生什么。请注意,当您开始输入 ProductName 属性的新名称 ProductCode 时,重命名窗口会显示红色错误,并且已存在的 ProductCode 属性周围也会显示一个红色框。

在此,Visual Studio 2015 智能地告知新属性名称已存在于类中,此更改可能会导致冲突。现在您知道此更改可能会导致应用程序崩溃,因此只需按 Escape 键,重命名窗口就会消失,并且您的新名称将恢复为旧名称。

因此,Visual Studio 有助于检测任何重命名冲突并建议如何解决它们。

重命名重载、字符串、代码注释

让我们再看一个场景。向 IProduct 接口添加一个名为 GetProduct 的重载方法,并在 MyProducts 类中实现该方法。

   1: interface IProducts
   2:  {
   3:      Product GetProduct(string productCode);
   4:      Product GetProduct(string productCode,string productName);
   5:      List<product> GetProductList();
   6:  }
   1: /// <summary>
   2:       /// GetProduct
   3:       /// </summary>
   4:       ///<param name="productCode" />
   5:       /// <returns></returns>
   6:       public Product GetProduct(string productCode)
   7:       {
   8:           return _allProduct.Find(p => p.ProductCode == productCode);
   9:       }
  10:  
  11:       /// <summary>
  12:       /// GetProduct with productCode and productName
  13:       /// </summary>
  14:       ///<param name="productCode" />
  15:       ///<param name="productName" />
  16:       /// <returns></returns>
  17:       public Product GetProduct(string productCode, string productName)
  18:       {
  19:           return _allProduct.Find(p => p.ProductCode == productCode && p.ProductName==productName);
  20:       }
  21:  

现在尝试在 MyProducts 类中重命名 GetProduct 方法。将光标放在 GetProduct 方法名称中间,然后按 Ctrl+R, Ctrl+R。重命名窗口将打开,如下图所示。

您会看到重命名窗口打开,其中包含更多选项,如下图所示。

如果选中“包含重载”复选框,则正在重命名的该方法的重载也将被重命名。在本例中,如果我们选择这些选项,GetProduct() 的重载方法也将被重命名。

如果我们还选择第二个选项,那么在重命名方法为新名称时,代码注释也会被重命名。代码注释中存在的名称也会被重命名为新名称。

重命名选项还允许重命名与该名称相关的 string,即第三个选项。您也可以在重命名之前预览更改。预览更改窗口显示了所有将保留的出现项,并再次为您提供了一个选项,可以查看并选择是否希望在特定实例中发生更改。在此,我尝试将 GetProduct 方法名称更改为 FetchProduct。让我们勾选“预览更改”复选框并按“应用”按钮。

将打开一个预览窗口。请注意,此窗口不仅累积了特定文件中的所有可能区域,还累积了可能发生更改并影响代码的所有区域,例如在 MyProduct.cs 文件、IProducts.cs 接口和 program.cs 文件中。它表明当方法名称更改时,也会反映在这些文件中。现在,开发人员可以选择是让该更改发生还是不发生。因此,预览窗口为开发人员提供了选项,可以为相应的受影响文件勾选或取消勾选以使该更改发生或不发生。Visual Studio 的代码建议和代码辅助机制非常强大,能够非常智能地处理所有这些修改和自动化。

在这种情况下,我没有取消选择任何文件,而是让更改发生。它会自动将 GetProduct 重命名为 Fetch Product,包括所有显示的区域,如注释、接口和程序文件。

同样,您也可以重命名方法中传递的参数,这也将包括所有可能的重命名选项,如在注释和方法中重命名。如下面的图像所示,如果我尝试重命名 FetchProduct 方法的参数,它会突出显示所有可能的重命名更改。

将光标放在 productCode 之间,然后按 Ctrl+R, Ctrl+R,重命名窗口将出现,并且参数的所有实例都会被突出显示,甚至包括注释。将名称更改为 pCode,然后单击“应用”。

我们看到参数名称以及注释中的名称都已更改。

结论

在本文中,我们介绍了 Visual Studio 2015 提供的重命名辅助功能。我们学习了各种重命名体验,包括以下要点:

  • 通过灯泡操作进行重命名辅助
  • 带有智能建议的更改预览
  • 重命名窗口及其重命名选项
  • 即时、实时重命名体验。边输入边重命名。
  • 重命名时的冲突检测和解决
  • 重命名代码注释

在本系列的下一部分,我将介绍 Visual Studio 2015 中的代码重构。

阅读更多

© . All rights reserved.