正确使用C#中的#region指令来进行代码的组织

时间:2021-05-02

本文旨在讲解如何正确地使用#region指令,以更好地组织代码。使用#region就是将一些有关联的代码组织在一起,然后折叠起来。这样你就在一个函数中看不到很长很长的代码段。例如:

  • publicvoidDoSomething()
  • {
  • boolshouldIDoSomething;
  • #regionDecideifIshoulddosomething
  • if(needToDoSomething&&haventDoneSomethingThisDay)
  • shouldIDoSomething=true;
  • else
  • {
  • //dosomeotherlogictodecideand
  • setshouldIDoSomethingtosomevalue
  • }
  • #endregion
  • if(shouldIDoSomething)
  • {done++;}}
  • 当然这段代码很简单。在实际项目中,你可能看到上百行甚至更多的代码在一个#region中。如果把它折叠起来。看起来就会很整洁。是吧?

  • publicvoidDoSomething()
  • {
  • boolshouldIDoSomething;
  • [DecideifIshoulddosomething]
  • if(shouldIDoSomething)
  • {done++;
  • }}
  • 我们只是把一些代码和一些变量组合起来放在#region中。如果你在仔细想想,其实我们相当与创建了一个新的函数,只是将这些方法内置到当前方法中。一个函数只做单一的一件事情,这是Clean Code这本书的一个原则。为什么我们不把它提取为一个方法呢,这样一来,一个函数就只做一件事情了。

  • publicvoidDoSomething(){
  • if(ShouldIDoSomething())
  • {done++;}}
  • privateboolShouldIDoSomething(){
  • if(needToDoSomething&&haventDoneSomethingThisDay)
  • shouldIDoSomething=true;
  • else
  • {
  • //dosomeotherlogictodecide
  • andsetshouldIDoSomethingtosomevalue}}
  • 这样看起来就清楚很多,因为我们降低了之前的DoSomething函数的复杂度。两个函数可以分开测试,确保没有逻辑错误。小段总结1: #region 不适合在大方法中使用,当你在一个方法中使用#region 的时候,停下来想想你刚刚写了什么代码?大多数时候,你可以将这些代码段独立成一个函数。

    看看下面这段非常漂亮的代码:

  • #regionGetCustomer
  • publicvoidGetCustomer(){
  • //codetogetthecustomer}
  • #endregion
  • #regionSaveCustomer
  • publicvoidSaveCustomer(){
  • //codetosavethecustomer}
  • #endregion
  • 将它折叠之后,变成下面这样:

  • [GetCustomer][SaveCustomer]
  • 这样做很容易阅读吗?这样做的目的是什么,我不明白?代码折叠就会变得更好?我觉得这样做只会让代码更难以阅读,因为你每次要看region中的代码,你都要展开一次。

    小段总结2:不要因为你能,你就使用#region 。

    再看下面这个例子

  • publicclassPriceCalculator{
  • publicdecimalCalculatePrice()
  • {decimalprice=100m;decimaldiscount=CalculateDiscount();
  • returnprice*(1m-discount));
  • }
  • #regionDiscountCalculation
  • privatevoidCalculateDiscount()
  • {decimaldiscount=0m;
  • if(CanApplyDiscount())
  • discount=0.05m;
  • returndiscount;
  • }
  • privatevoidCanApplyDiscount(){
  • //somelogic,othermethodcalls}
  • //someotherdiscountcalculationmethods...
  • #endregion}
  • 如果你将这个例子和本文中的第一个例子做下比较,你可能会看到它们的共同点。他们是相同的,不过一个是在类中,一个是在函数中,层级不同而已。这里在提一个原则:单一职责原则,一个类应该只有一个职责。看上面的类,你可以很容易看出它有两个职责:价ge计算和折扣计算。折扣计算的方法被放到一个#region中。同样,可以将它们提取出来做为一个新类。

    小段总结3:可以将一组相关的函数提取到一个职责单一的新类中。

    那我们到底怎么使用 #region 呢。将东西用它来分组,它是非常有用的。在我写的类中或多或少有几个regions,用来对类中不同的结构进行分组。比如: fields, properties, methods, events, types等。如果你打开我写的类文件,你会看到结构如下:

  • publicclassSomeClass{
  • [Events]
  • [Fields]
  • [Properties]
  • [Methods]}
  • 总的来说:我将region看成能控制阅读源代码的复杂度的一种方式。因为你可以将一些相关的代码放在一个区域(region)里面。但是,这不是随便就创建的新的方法或者新类的借口。其实Region并不能消除复杂度,它只是在你阅读代码的时候,隐藏了部分代码。你必须通过写出小巧,清晰,重点突出的方法和类,才能控制代码的复杂度。当你做到这些的时候,你甚至会发现region是不必要的。

    原文标题:如何正确地使用#region指令

    链接:http:///zhuqil/archive/2010/09/07/about-region-preprocessor-directive.html

    本文源自:翔宇亭——IT乐园(http://),转载请保留此信息!

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章