在维护大量使用 #region(无论是 C# 还是 VB.NET)的代码后,我认为这种结构只是程序员的一堆“繁琐工作”。将它们放入代码中需要付出努力,而且它们会使查找和阅读代码变得非常烦人。
那么,使用 #region 的好处是什么呢?为什么程序员要额外费心将其放入代码中呢?
让我相信它的价值吧!
在维护大量使用 #region(无论是 C# 还是 VB.NET)的代码后,我认为这种结构只是程序员的一堆“繁琐工作”。将它们放入代码中需要付出努力,而且它们会使查找和阅读代码变得非常烦人。
那么,使用 #region 的好处是什么呢?为什么程序员要额外费心将其放入代码中呢?
让我相信它的价值吧!
已经有人提出了类似的问题。
但是...
我个人认为,这不再是一个问题。在早期版本的.NET中,它最初是用来隐藏WinForms中的生成代码的。随着部分类的引入,这种需求似乎消失了。在我的看法中,现在它被过度使用作为一种组织结构,没有任何编译器价值,只是为了IDE而存在。
http://www.rauchy.net/regionerate/ - 自动化地将您的代码区域化 ;)
我喜欢使用区域来对大型类中的各个部分进行分组,比如所有属性、所有常量等。我经常会折叠掉我当前不需要看到的代码,所以我很喜欢区域。
此外,我在实现接口时也发现区域非常有用,特别是多个接口的情况下。我可以将每个接口的方法、属性、事件等分组,这样一眼就能看出哪个方法属于哪个接口。
我经常使用它们。像其他任何东西一样,它们可以被用作恶和善的工具,并且肯定会成为糟糕设计的标志,但它们可以被用来很好地组织代码。
#region Properties
#region Update Section
#region Accessors
当然你应该避免Jeff的例子
#Sweep under carpet
正如Jeff所指出的那样,我觉得奇怪的是它们是用于UI目的的编译器预处理命令。我相信VS团队可以用另一种方式做出同样有用的东西。
#region public int ObjectDepthThreshold
public int ObjectDepthThreshold
{
get { return (int)GetValue(ObjectDepthThresholdProperty); }
set { SetValue(ObjectDepthThresholdProperty, value); }
}
public static readonly DependencyProperty ObjectDepthThresholdProperty = DependencyProperty.Register(
"ObjectDepthThreshold",
typeof(int),
typeof(GotoXControls),
new FrameworkPropertyMetadata((int)GotoXServiceState.OBJECT_DEPTH_THRESHOLD_DEFAULT,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnControlValueChanged)
)
);
#endregion
public int ObjectDepthThreshold
我讨厌过度使用这些标签。我唯一觉得它们有用的地方就是隐藏那些你可能永远不想再看到的东西。但那些东西应该放在图书馆之类的地方。
继 Russell Myers 之前所说的话,如果你学会如何正确地重构代码(这是熟练开发人员必须学会的技能),实际上就不太需要使用区域了。
几周前我认为区域很棒,因为它们可以隐藏我的臃肿代码,但在练习我的代码技能后,我能够让它变得更加精简,现在我适合一个大小为7的类(未来应该制定一个这样的重构度量标准!:P)
我发现除了最简单的用法外,他们会混淆代码。我们项目中唯一推荐使用的是IDE使用的用法(接口实现和设计师代码)。
正确的工具应该用于正确的目的。代码应该被编写以显示意图和功能,而不是任意地分组东西。将东西组织成访问修饰符分组或其他分组似乎是不合逻辑的。我认为代码应该按照特定类的意义进行组织;毕竟,还有其他工具可以通过访问修饰符查看类成员。几乎所有其他用途的区域也是如此,有更好的方法。
例如,将属性、事件、常量或其他内容分组在一起并没有太多意义,因为如果按函数将这些内容分组,代码通常更易于维护(例如,使用常量的属性应该靠近该常量,而不是靠近其他无关的属性,仅仅因为它是一个属性)。
我经常使用它们来代替注释,对类的功能组进行排序,例如“配置公共接口”,“状态公共接口”,“内部处理”和“内部工作线程管理”。
通过使用键盘快捷键“折叠到定义”和“展开当前块”,我甚至可以轻松浏览更大的类。
不幸的是,C++的区域功能已经失效,微软似乎认为不需要修复。