您如何推荐使用#region / #endregion?应该用什么程度替换使用子函数来澄清你的代码?
答案 0 :(得分:22)
完全没有。
首先,#regions
更像是将许多相关功能/成员分组到可折叠区域的方式。它们不旨在将单个数千行函数构造成部分。 (话虽这么说,如果你写一个方法太久以至于你考虑用#region
来构造它,那么你可能会做一些严重的错误。区域与否,该代码将无法维护。期间。)< / p>
然而,许多人认为它并没有真正帮助,你应该考虑重写实际需要区域的类是可以理解的。此外,地区往往隐藏令人讨厌的代码。
答案 1 :(得分:3)
#region
/ #endregion
是一种逻辑分组属于同一类的代码部分的方法。就个人而言,我倾向于将私人领域声明,财产,公共职能和私人职能分组。
有时我会使用这些关键字对代码的某些部分进行分组,这些部分需要经常处理和更新,例如计算方法。
答案 2 :(得分:0)
如果某个班级中有多个“逻辑”代码组,则您的班级违反了单一责任原则。
将其排序,您不再需要区域。
答案 3 :(得分:0)
区域在理论上似乎很好,但根据我的经验,这是一个经常被滥用的功能。
程序员喜欢订单;大多数人喜欢将东西整理成小盒子。他们将混乱的代码,字段,属性,构造函数,方法,公共方法,内部方法,私有方法,辅助方法,常量,接口实现分组,上帝知道还有什么。
我能想到的唯一让我感到更烦恼的是使用部分类来隐藏复杂性。
无论如何,虽然过度使用地区通常是隐藏不应该存在的混乱的迹象,但我也看到了被它们淹没的好代码。我已经下载了一些由受人尊敬的程序员编写的开源项目。这些人正在写一些很棒的代码,但是,哦,这是什么?
一个领域?田野地区! 两个属性?物业区! 一个构造函数?构造函数区域! 一个私人方法?私有方法区域!
我可以继续。
直到今天,当我看到这一点时,我仍然感到震惊。在某些情况下,区域,空白行,另一个空白行和结束区域可占用原始代码的5倍空间(5行有区域,1行没有)。它基本上是强迫症的一种形式;在编写软件的过程中,这些区域可能会吸引我们的秩序感,但在实践中它们是无用的 - 纯粹的噪音。当我第一次开始编写c#时,我也以这种方式滥用它们。但后来我意识到我的代码有多吵,每次打开文件时都会按下ctrl-k l表示我做错了。
当一个类实现一个具有很多属性的接口(例如用于数据绑定)或甚至一组用于实现某些相关功能的方法时,我可以理解它,但对于所有东西?。这毫无意义。
我时不时地使用地区,但是......我行使了很多克制。
答案 4 :(得分:0)
我觉得使用某个地区的唯一情况是完全没问题,请参阅下面的代码。一旦我做对了,我再也不想再看那些常数了。实际上,我每天都在使用这个课程,而且我认为在过去的四年中我唯一没有完成这个区域的时候就是我需要在Python中重新实现它。
我认为(希望,祈祷)这段代码的情况是一个边缘情况。 C#常量基于VB3类型声明,该声明定义了C ++函数返回的COBOL数据结构的布局方式。是的,我把它移植到Python。我很好。我很想学习Haskell 只是,以便我可以在其中重写我的Python代码,着眼于有一天在OCaml中重新实现我的Haskell代码。
#region buffer_definition
/*
The buffer is a byte array that is passed to the underlying API. The VB representation of
the buffer's structure (using zero-based arrays, so each array has one more element than
its dimension) is this:
Public Type BUFFER_TYPE
Method As String * 50
Status As Integer
Msg As String * 200
DataLine As String * 1200
Prop(49) As String * 100
Fld(79) As String * 20
Fmt(79) As String * 50
Prompt(79) As String * 20
ValIn(79) As String * 80
ValOut(79) As String * 80
End Type
The constants defined here have the following prefixes:
len = field length
cnt = count of fields in an array
ptr = starting position within the buffer
*/
// data element lengths
private const int len_method = 50;
private const int len_status = 2;
private const int len_msg = 200;
private const int len_dataLine = 1200;
// array elements require both count and length:
private const int cnt_prop = 50;
private const int len_prop = 100;
private const int cnt_fld = 80;
private const int len_fld = 20;
private const int len_fmt = 50;
private const int len_prompt = 20;
private const int len_valIn = 80;
private const int len_valOut = 80;
// calculate the buffer length
private const int len_buffer =
len_method
+ len_status
+ len_msg
+ len_dataLine
+ (cnt_prop * len_prop)
+ (cnt_fld * (len_fld + len_fmt + len_prompt + len_valIn + len_valOut));
// calculate the pointers to the start of each field. These pointers are used
// in the marshalling methods to marshal data into and out of the buffer.
private const int PtrMethod = 0;
private const int PtrStatus = PtrMethod + len_method;
private const int PtrMsg = PtrStatus + len_status;
private const int PtrDataLine = PtrMsg + len_msg;
private const int PtrProp = PtrDataLine + len_dataLine;
private const int PtrFld = PtrProp + (cnt_prop * len_prop);
private const int PtrFmt = PtrFld + (cnt_fld * len_fld);
private const int PtrPrompt = PtrFmt + (cnt_fld * len_fmt);
private const int PtrValIn = PtrPrompt + (cnt_fld * len_prompt);
private const int PtrValOut = PtrValIn + (cnt_fld * len_valIn);
[MarshalAs(UnmanagedType.LPStr, SizeConst = len_buffer)]
private static byte[] buffer = new byte[len_buffer];
#endregion
答案 5 :(得分:0)
我认为函数应该只用于可重用的代码。这就是他们的设计目标。没有什么比看到为只调用一次的东西创建一个函数更让我感到愤怒的了。
使用区域。
如果你需要做500行,那么输入500行。如果你想把它连接起来使用一个区域,如果有任何可重复使用的话,那就使用一个函数。