这取决于该条件(在本例中为writeCommand != null)是 CommandConsumerCount 方法和 IsOwnerOf 方法的要求,还是仅 IsOwnerOf 方法的要求。
如果只有 IsOwnerOf 方法真正需要该条件,则可以从 CommandConsumerCount 方法中省略它。
但是,如果这两种方法都需要该条件,那么我将坚持我的原始答案:
我认为由于您的两种方法都是公开的,因此应该重复合同要求。如果您有一个执行实际工作的私有方法,IsOwnerOf 方法和 CommandConsumerCount 方法都调用了该方法(而不是调用 IsOwnerOf 方法的 CommandConsumerCount 方法),那么在其中省略对 Contract.Requires 的调用就可以了私有方法。
就性能而言...我不会担心这些检查对性能的影响,除非检查本身的逻辑非常复杂。您可以设置编译器以从项目属性的“代码合同”部分的编译输出中排除对 Contract.Requires 的调用(假设您已安装必要的插件)。
不过,也许我错过了你的问题的重点。您是在问是否可以在 CommandConsumerCount 方法中完全省略对 IsOwnerOf 的调用?在这种情况下,我会保留调用,但如果这是一个性能问题,那么我会配置项目以排除对 Release 版本的调用,假设我已经使用 Debug 版本进行了足够的测试以确保这种情况是满意。
编辑:重新阅读问题后,您似乎很清楚您在询问writeCommand != null 检查,所以我删除了上面的段落。
下面的代码示例添加了一个执行 IsOwnerOf 方法实际工作的私有方法。
// you may want to choose a different name for this method
private bool _IsOwnerOf(IWriteCommand)
{
// actual work is done here in this private method
return default(bool);
}
public bool IsOwnerOf(IWriteCommand writeCommand)
{
Contract.Requires(writeCommand != null);
// call the private method to perform the actual work
return _IsOwnerOf(writeCommand);
}
public int CommandConsumerCount(IWriteCommand writeCommand)
{
Contract.Requires(writeCommand != null);
Contract.Requires(_IsOwnerOf(writeCommand)); // call the private _IsOwnerOf method instead of the public method
Contract.Ensures(Contract.Result<int>() >= 0);
return default(int);
}