C# · 12月 31, 2021

c# – 按合同和构造函数设计

我正在为了学校目的而实现我自己的ArrayList,但是要调用一些我试图使用C#4.0代码合同的东西.一切都很好,直到我需要添加合同到构造函数.我应该在空参数构造函数中添加Contract.Ensures()吗? public ArrayList(int capacity) { Contract.Requires(capacity > 0); Contract.Ensures(Size == capacity); _array = new T[capacity]; } public ArrayList() : this(32) { Contract.Ensures(Size == 32); }

我会说是的,每个方法应该有一个明确的合同.另一方面,为什么只要将工作委托给“主”构造函数呢?在逻辑上,我不需要.

我看到在两个构造函数中明确定义合同有用的唯一一点是,如果将来我们有Intelisense对合同的支持.会发生这种情况,明确说明每种方法具有的合同是有用的,如Intelisense所示.

另外,有没有关于“合同设计”的原则和用法的书籍呢?有一点是了解如何使用语言(C#,在这种情况下)使用合同的语法,另外一个是知道如何和何时使用它.我读了几篇教程和Jon Skeet的“深度”文章中的C#,但如果可能,我想要更深入一些.

谢谢

解决方法 我完全不同意托马斯的回答.只要你在ArrayList()的实现中做出选择,你应该有一个合同来记录这些选择.

在这里,您可以选择使用参数32调用主构造函数.还有许多其他可以决定做的事情(不仅仅是关于默认大小的选择).给与ArrayList()几乎完全相同的ArrayList()的文档,你决定不做大部分愚蠢的事情,你可以做,而不是直接调用它.

答案“它称之为主要构造函数,所以让主构造商的合同完成工作”完全忽略了这个合同在那里可以避免您不必考虑实现的事实.对于基于运行时断言检查的验证策略,即使对于几乎直接调用另一个构造函数/方法的这种简短的构造函数/方法,编写合同的缺点就是您最终检查两次.是的,这似乎是多余的,但是运行时断言检查只是一个验证策略,DbC的原则是独立的.原则是:如果可以调用,它需要一份合同来记录它的作用.