我最近使用代码合同迁移了大量的手动前置条件测试和异常抛出。我没有升级到.NET 4,而是一直使用Microsoft.Contracts.dll
程序集,所以我可以坚持使用.NET 3.5(这是一个.NET 3.5和.NET 4程序集都使用的库) 。我在Visual Studio 2010中设置了合同重写器,合同工作正常。
但是,由于我已经完成了这个转换,我注意到调试器在带有契约的方法中表现得很有趣,特别是在具有ContractInvariantMethod的类中。执行游标似乎并不总是与突出显示的行匹配,一些断点无法被命中,我有一个方法,调试器无法告诉局部变量名称,并显示像CS$1$0000
这样的东西。这是在调试版本中。
在.NET 3.5到VS10的Microsoft.Contracts.dll
中使用代码合同是否存在已知问题?
.NET 4中的代码合同是否会出现类似的问题?
[编辑]这个问题让我在Microsoft Connect上创建了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/573983/code-contract-rewriting-messes-up-local-variable-names-in-iterator-methods-while-debugging
答案 0 :(得分:1)
我希望你知道合同重写意味着什么 - 动态生成的额外代码没有任何源代码供编译器锁定。由于CLR具有许多不同的元素,因此调试器根本不会做任何事情或者会混淆很多事情,只有具有广泛影响的全面语言功能才能获得完整调试器支持的预算。例如lambda表达式。
这并不是说提交错误不是出于好的原因,只是当你使用尚未完全开发的方面时,你不应期望任何事情变得更好。早期采用者总是有这样的代价,但也有吹牛的权利: - )
答案 1 :(得分:0)
请记住,代码合同目前不适用于Post条件&多线程。 限制合约只做前提条件重写。 这解决了我们系统中的很多问题。