避免或接受破坏编辑和继续的C#构造?

Bra*_*ith 20 c# debugging lambda anonymous-methods edit-and-continue

我开发并维护一个用C#2.0编写的大型(500k + LOC)WinForms应用程序.它是多用户,目前部署在大约15台机器上.系统的开发正在进行中(可以被认为是一个永久的测试版),并且很少有人能够保护用户免受可能在每周构建中引入的潜在新错误的影响.

出于这个原因,我发现自己变得非常依赖于调试器中的编辑和继续.它不仅有助于寻找漏洞和修复漏洞,而且在某些情况下还可以进行持续开发.我发现能够在正在运行的应用程序的上下文中执行新编写的代码非常有价值 - 不需要重新编译并为新代码添加特定的入口点(必须添加虚拟菜单选项,按钮等等)应用程序并记住在下一个生产构建之前删除它们 - 所有内容都可以在不停止进程的情况下实时进行测试和测试.

我坚持编辑并继续这么高的考虑,我积极地编写代码以完全兼容它.例如,我避免:

  • 匿名方法和内联委托(除非完全不可能重写)
  • 通用方法(稳定,不变的实用程序代码除外)
  • 以'任何CPU'为目标的项目(即永远不会以64位执行)
  • 在声明点初始化字段(初始化移动到构造函数)
  • 编写使用的枚举器块yield(实用程序代码除外)

现在,我完全清楚C#3和4中的新语言功能在很大程度上与编辑和继续(lambda表达式,LINQ等)不兼容.这是我拒绝将项目迁移到更新版本的框架的原因之一.

我的问题是,避免使用这些更高级的结构来支持非常非常容易调试的代码是否是一种好的做法?这种发展是否合法,还是浪费?另外,重要的是,这些构造中的任何一个(lambda表达式,匿名方法等)是否会产生性能/内存开销,这些代码可以避免编写良好,编辑和继续兼容的代码?...或者C#编译器的内部工作方式是否使这些高级构造比手动编写的"扩展"代码运行得更快?

Mit*_*eat 21

不想听起来陈旧 - 编写单元/集成测试而不是依赖Edit-Continue是一种好习惯.

这样,你花了一次力,每隔一段时间都是'免费的'......

现在我不建议你回顾性地编写所有代码的单位; 相反,每次你必须修复一个错误,首先要编写一个测试(或更常见的多个测试)来证明修复.

正如@Dave Swersky在评论中提到的那样,Mchael Feathers的书"有效地使用遗留代码"是一个很好的资源(它是你写的后5分钟的遗产,对吧?)

所以,是的,我认为避免新的C#结构有利于允许编辑和继续是错误的; 但我也认为仅仅为了它而接受新结构是错误的,特别是如果它们导致更难理解代码.

  • 如果可以的话,+ 100.编写代码专门用于支持编辑并继续而不使用单元测试,温和地说,不是最好的方法恕我直言.我是否也可以推荐这本书*有效使用遗产代码*:http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 (4认同)

Jim*_*ill 6

我喜欢'编辑并继续'.我发现它是交互式开发/调试的一个巨大推动因素,当它不起作用时我也觉得很烦人.

如果"编辑并继续"有助于您的开发方法,那么请务必做出选​​择以促进它,同时牢记您放弃的价值.

我的一个烦恼是,使用lambda表达式编辑函数中的任何内容都会破坏"编辑并继续".如果我绊倒它,我可能会写出lambda表达式.我正在使用lambda表达式.我可以用它们更快地完成一些事情,但是如果我最后把它们写出来,它们就不会节省我的时间.

在我的情况下,我不想使用lambda表达式.如果它们妨碍我将它们包装在一个函数中,以便我可以"编辑并继续"使用它们的代码.如果他们是无偿的,我可以写出来.

你的方法不需要是黑白的.