博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一起谈.NET技术,C#中使用#region指令的一些想法
阅读量:6826 次
发布时间:2019-06-26

本文共 2616 字,大约阅读时间需要 8 分钟。

  这篇文章我将不会去介绍如何使用#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中。如果你在仔细想想,其实我们相当与创建了一个新的函数,只是将这些方法内置到当前函数中。一个函数只做单一的一件事情,这是这本书的一个原则。为什么我们不把它提取为一个函数呢,这样一来,一个函数就只做一件事情了。

 
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是不必要的。

  本文翻译:

转载地址:http://nbykl.baihongyu.com/

你可能感兴趣的文章
获取不到scrollTop的问题
查看>>
iterm 配置
查看>>
【刷算法】求机器人的运动范围
查看>>
cookie跨域共享 cookie二级域名共享 前后端分离项目共享cookie
查看>>
Dart4Flutter-01– 变量, 类型和 函数
查看>>
k8s与监控--prometheus的远端存储
查看>>
Extjs的一些基础使用!
查看>>
改名之后的Java EE,现在有什么新进展?
查看>>
.NET Core如何为项目提供高性能解决方案?
查看>>
使用Vue快速开发单页应用-登录页面
查看>>
单元格动态合并
查看>>
运维安全系列基础服务之 FTP 服务(系列一)
查看>>
[LeetCode] House Robber I II
查看>>
Dagger依赖注入入门
查看>>
很好的东西
查看>>
没有 Python,微软宣布 Excel 新增 JavaScript 支持
查看>>
用70亿美元收购Mellanox,英伟达阔绰出手“打败”Intel ...
查看>>
北汽上汽广汽为有感科技站台:主机厂眼中的无线充电技术应具备什么? ...
查看>>
设计模式——外观模式
查看>>
struts2开发时通过interceptor拦截器实现输入数据过滤前后空格的功能 ...
查看>>