Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编写关于引发事件的方法的代码契约_C#_Events_Code Contracts - Fatal编程技术网

C# 编写关于引发事件的方法的代码契约

C# 编写关于引发事件的方法的代码契约,c#,events,code-contracts,C#,Events,Code Contracts,我在使用事件的接口上编写代码契约: 接口事件接口{ 添加事件处理程序项; bool-Add(T项); } 将项添加到实现该接口的集合时,该集合必须引发itemsadded事件。 只有在添加项目时才必须引发事件; 这是由返回值给出的(设想一个集合,其中true表示该项已添加,false表示该项未添加,因为它已存在于集合中) 我希望有一份合同,以确保如果结果是真实的,将提出一个事件。 同样,如果结果为false,则不会引发任何事件。 有没有办法检查是否使用契约?这不是代码契约设计的目的。使用接口约

我在使用事件的接口上编写代码契约:

接口事件接口{
添加事件处理程序项;
bool-Add(T项);
}
将项添加到实现该接口的集合时,该集合必须引发
itemsadded
事件。 只有在添加项目时才必须引发事件; 这是由返回值给出的(设想一个集合,其中
true
表示该项已添加,
false
表示该项未添加,因为它已存在于集合中)

我希望有一份合同,以确保如果结果是真实的,将提出一个事件。 同样,如果结果为false,则不会引发任何事件。
有没有办法检查是否使用契约?

这不是代码契约设计的目的。使用接口约定时,只能指定有关接口方法的参数返回值的详细信息


您可能想要编写一个包含事件逻辑的抽象基类,或者您可以为此设置一些单元测试。

您不能“抛出”事件。“Raised”是正确的,您已经使用了它,您应该用它替换“throw”的所有实例。其次,代码契约是一种向调用方保证的方法,如果调用方满足声明的先决条件,那么他们可以期望声明的后决条件(如果有)和对象不变量(如果有)。对象的任何其他“内部”行为(例如引发事件)将完全由您负责,正如Franz所说,这可以通过执行单元和/或集成测试轻松确保。此外,代码契约不是软件测试的替代品。这些工具是互补的,始终需要进行测试以确保软件的质量。