Visual Studio 2015 中的代码重构






4.93/5 (16投票s)
在本文中,我将展示如何利用 Visual Studio 2015 的功能来优化您的代码。
引言
代码重构一直是开发人员面临的挑战。 这是开发人员编写优化、简洁和快速代码应该具备的主要技能之一。 过去有一些第三方工具可以帮助您实现这一目标,但没有一个能像 Visual Studio 2015 那样展示出如此强大的功能。 Visual Studio 一直以来都提供零星的代码重构技术,但最新版本的 Visual Studio 提供了独特的体验,可以实现代码重构。 Visual Studio 中的代码重构提供了许多功能。 我们将介绍其中的一些功能,例如内联临时变量和引入局部变量。 关于内联临时变量和引入局部变量的重构不仅限于 C#,VB 开发人员也可以利用此功能。 我们将以一个小方法为例来介绍该主题,并尝试尽可能地对其进行优化。 值得注意的是,代码重构软件和技术仅适用于精明的开发人员。 如果您不了解新代码的作用,并且觉得它很奇怪,则永远不要尝试。
学习 Visual Studio 2015 系列
- 第 1 天:Visual Studio 2015 中的代码辅助
- 第 2 天:Visual Studio 2015 中的代码分析器
- 第 3 天:Visual Studio 2015 中的重命名辅助
- 第 4 天:Visual Studio 2015 中的代码重构
- 第 5 天:Visual Studio 2015 中的调试改进(断点配置和新错误列表)
- 第 6 天:Visual Studio 2015 中的调试改进(LINQ 和 Lambda 的工具窗口支持、PerfTips、诊断工具窗口)
案例研究
我将以我们在前面部分中创建的 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> _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: /// <summary> 23: /// FetchProduct 24: /// </summary> 25: /// <param name="pCode"></param> 26: /// <returns></returns> 27: public Product FetchProduct(string pCode) 28: { 29: return _allProduct.Find(p => p.ProductCode == pCode); 30: } 31: 32: /// <summary> 33: /// FetchProduct with productCode and productName 34: /// </summary> 35: /// <param name="productCode"></param> 36: /// <param name="productName"></param> 37: /// <returns></returns> 38: public Product FetchProduct(string productCode, string productName) 39: { 40: return _allProduct.Find(p => p.ProductCode == productCode && p.ProductName==productName); 41: } 42: 43: public List<Product> GetProductList() 44: { 45: return _allProduct; 46: } 47: } 48: }
我们将向此类添加另一个方法。 该方法的目标是从价格大于 30000 的产品列表中返回所有产品。 为了便于理解,我尽量保持逻辑和方法非常简单。 我将此方法的名称保留为 FetchProduct()
。 请注意,我们已经有两个同名的方法。 现在,这也将作为 FetchProduct()
方法的重载。
上述方法本质上非常简单,包含一个 LINQ 查询,用于获取价格大于 30000 的产品。 当您从 *Program.cs* 调用此方法并遍历元素时,我们得到以下结果。
*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.FetchProduct("0002").ProductName)); 15: Console.WriteLine(Environment.NewLine); 16: var productList = myProducts.FetchProduct(); 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: }
因此,我们的方法运行良好。 问题是我们还能在多大程度上优化此方法。 当您单击 products 变量之间时,会出现一个灯泡图标,其中包含一些您可以应用于此行以进行优化的建议。
现在,内联临时变量开始发挥作用。 灯泡图标表示删除此变量并将该代码放在一行中。 当您预览此代码辅助功能建议的更改时,您将获得以下预览窗口。
它表明临时 products 变量将被 productList
本身替换,因此有助于我们节省行数以及变量的内存分配。 单击应用更改,您将获得重构后的代码。
现在可以进一步重构此代码吗? 您可以从灯泡图标寻求帮助。 或者单击 productList
变量之间,或者右键单击 productList
变量并从上下文菜单中打开“快速操作”。
我们在这里看到,productList
也是一个临时变量,建议也将其删除。 让我们预览更改并将其应用于获得更优化的代码。 这样做,productList
变量将被单个 return 语句替换,但是您会在此处注意到一个错误。 如果您还记得,我说过代码重构是为聪明且精明的开发人员准备的。 我们在这里看到,在重构代码时,LINQ 查询未封装在括号中,并且 ToList()
方法直接应用于 "p" 变量。 我们必须通过在 LINQ 查询周围加上括号来纠正此问题。 这是其中一种情况,您可能会遇到很多这样的情况。 因此,您必须确定要进行的更改。 Visual Studio 仅提供建议,它不会为您编写代码。
现在我们有了一个 return 语句。 我们的代码已减少到只有一行,并且通过忽略临时变量,我们还节省了内存。 这肯定会使代码更快,但是我们还能进一步优化此方法吗? 让我们尝试一下并单击 return 语句。 您将再次看到灯泡图标出现,其中包含一些建议。
它说该方法可以转换为表达式主体成员。 让我们预览一下更改。
预览显示该方法已转换为表达式。 看到这一点,我没有发现任何问题。 因此,为了重构,我们当然可以选择此选项。 按下应用更改,我们得到以下代码。
现在,如果您尝试进一步优化此方法,您将找不到太多空间。
结论
这只是一个小的示例,我展示了如何利用 Visual Studio 2015 的功能来优化您的代码。 在本系列的下一部分中,我将介绍 Visual Studio 2015 中的调试功能等主题。