在代码中正确的使用它#region
来源:互联网 发布:慈溪行知 编辑:程序博客网 时间:2024/05/22 17:14
#region 使您可以在使用 Visual Studio 代码编辑器的大纲显示功能时指定可展开或折叠的代码块。 在较长的代码文件中,能够折叠或隐藏一个或多个区域会十分便利,这样,您可将精力集中于当前处理的文件部分。 下面的示例演示如何定义区域:
#region MyClass definitionpublic class MyClass { static void Main() { }}#endregion
#region 块必须以 #endregion 指令终止。
#region 块不能与 #if 块重叠。 但是,可以将 #region 块嵌套在 #if 块内,或将 #if 块嵌套在 #region 块内。
这篇文章我将不会去介绍如何使用#region指令。因为每个C#开发人员都应该见过和使用过#region指令的。这篇文章将讨论如何在代码中正确的使用它。使用#region就是将一些有关联的代码组织在一起,然后折叠起来。这样你就在一个函数中看不到很长的令人头痛的代码段。例如:
public void DoSomething(){ bool shouldIDoSomething; #region Decide if I should do something if(needToDoSomething && haventDoneSomethingThisDay) shouldIDoSomething = true; else { // do some other logic to decide and set shouldIDoSomething to some value } #endregion if(shouldIDoSomething) { done++; }}
当然这段代码很简单。在实际项目中,你可能看到上百行甚至更多的代码在一个#region中。如果把它折叠起来。看起来就会很整洁。是吧?
public void DoSomething(){ bool shouldIDoSomething; [Decide if I should do something] if(shouldIDoSomething) { done++; }}
只是把一些代码和一些变量组合起来放在#region中。如果你在仔细想想,其实我们相当与创建了一个新的函数,只是将这些方法内置到当前函数中。一个函数只做单一的一件事情,这是Clean Code这本书的一个原则。为什么我们不把它提取为一个函数呢,这样一来,一个函数就只做一件事情了。
public void DoSomething(){ if(ShouldIDoSomething()) { done++; }} private bool ShouldIDoSomething(){ if(needToDoSomething && haventDoneSomethingThisDay) shouldIDoSomething = true; else { // do some other logic to decide and set shouldIDoSomething to some value }}
上面看起来就清楚很多,因为我们降低了之前的DoSomething函数的复杂度。两个函数可以分开测试,确保没有逻辑错误。
小段总结1: #region 不适合在大方法中使用,当你在一个方法中使用#region 的时候,停下来想想你刚刚写了什么代码?大多数时候,你可以将这些代码段独立成一个函数。
看看下面这段非常漂亮的代码:
#region Get Customer public void GetCustomer(){ // code to get the customer} #endregion #region Save Customer public void SaveCustomer(){ // code to save the customer} #endregion
将它折叠之后,变成下面这样:
[Get Customer] [Save Customer]
这样做很容易阅读吗?这样做的目的是什么,我不明白?代码折叠就会变得更好?我觉得这样做只会让代码更难以阅读,因为你每次要看region中的代码,你都要展开一次。
小段总结2:不要因为你能,你就使用#region 。
再看下面这个例子
public class PriceCalculator{ public decimal CalculatePrice() { decimal price = 100m; decimal discount = CalculateDiscount(); return price * (1m - discount)); } #region Discount Calculation private void CalculateDiscount() { decimal discount = 0m; if(CanApplyDiscount()) discount = 0.05m; return discount; } private void CanApplyDiscount() { // some logic, other method calls } // some other discount calculation methods ... #endregion}
如果你将这个例子和本文中的第一个例子做下比较,你可能会看到它们的共同点。他们是相同的,不过一个是在类中,一个是在函数中,层级不同而已。这里在提一个原则:单一职责原则,一个类应该只有一个职责。看上面的类,你可以很容易看出它有两个职责:价格计算和折扣计算。折扣计算的方法被放到一个#region中。同样,可以将它们提取出来做为一个新类。
小段总结3:可以将一组相关的函数提取到一个职责单一的新类中。
那我们到底怎么使用 #region 呢。将东西用它来分组,它是非常有用的。在我写的类中或多或少有几个#region,用来对类中不同的结构进行分组。比如: fields, properties, methods, events, types等。如果你打开我写的类文件,你会看到结构如下:
public class SomeClass{ [Events] [Fields] [Properties] [Methods]}
总的来说:我将#region看成能控制阅读源代码的复杂度的一种方式。因为你可以将一些相关的代码放在一个区域(#region)里面。但是,这不是你随便就创建新方法或者新类的借口。其实Region并不能消除复杂度,它只是在你阅读代码的时候,隐藏了部分代码。你必须通过写出小巧,清晰,重点突出的方法和类,才能控制代码的复杂度。当你做到这些的时候,你甚至会发现#region是不必要的。
本文翻译:About #region preprocessor directive
- 在代码中正确的使用它#region
- 代码中日志打印的正确使用
- extern C的作用详解(通过它可以在c++中使用c代码)
- 在QML语言中怎么定义signal并怎么正确使用它
- 在iBATIS中正确的使用$和#
- 在C#中,#region的作用
- 在C#中,#region的作用
- 在实际使用它的过程中不需要再次使用 ‘
- 在存储过程中编写正确的事务处理代码
- 在存储过程中编写正确的事务处理代码
- 在存储过程中编写正确的事务处理代码
- VS中使用预处理指令#pragma region自由折叠代码
- 正确使用react的refs/props/state及其它
- 关于在flash中正确的使用oop(摘录)
- 怎样在windows中正确的使用PeekMessage
- 正确的在ViewPager中使用Bitmap图像
- 正确的在GridView中使用Bitmap图像
- 在 Go 语言中,正确的使用并发
- 【数据结构和算法可视化的分享】
- C语言位运算
- 软件开发概述
- spring mvc 教程
- e-企业管理解决方案-企业集团角色控制
- 在代码中正确的使用它#region
- [Matlab]趣题:你会选择哪种赌法?
- 2013腾讯编程马拉松初赛第一场(3月21日)小明系列故事——师兄帮帮忙
- HDU 1010 Tempter of the Bone - (DFS) 奇偶剪枝
- 三角类2
- SQL的主键和外键约束
- 使用windows的telnet工具收发邮件
- tweenmax,imageloader
- C# get set 的用法经验