C# 为构造函数参数放置契约

C# 为构造函数参数放置契约,c#,code-contracts,contracts,C#,Code Contracts,Contracts,假设我们有一个与contract类的接口,如下所示 [ContractClassFor(typeof(Custom))] public abstract class CustomContract : Custom { public string GetPerson(int i) { Contract.Requires(i > 0); Contract.Ensures(!String.IsNullOrEmpty(Contract.Result&

假设我们有一个与contract类的接口,如下所示

[ContractClassFor(typeof(Custom))]
public abstract class CustomContract : Custom
{
    public string GetPerson(int i)
    {
        Contract.Requires(i > 0);
        Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));
        return default(string);
    }
    public string Name { get; set; }
}

[ContractClass(typeof(CustomContract))]
    public interface Custom
    {
        string GetPerson(int i);
        string Name { get; set; }
    }
将构造函数中的
抛出新ArgumentNullException
替换为
Contract.Requires(obj!=null)有意义吗?

契约应该由接口定义,因为构造函数是实现的一部分,而不是接口,所以我倾向于当前的方法。
这是一个好的实践吗?

为了最大限度地利用代码契约,是的,将
ArgumentNullException
抛出替换为
Contract.Requires
是有意义的

考虑到您使用的是接口和契约类,这是完全正确的。除了构造函数本身之外,没有其他地方可以验证构造函数参数

如果您使用
ArgumentNullException
方法,那么您将错过代码契约的静态检查和其他好处

    public class CustomProcessor: Custom
    {
         public CustomProcessor(ISomeinterface obj, string logname)
         {
              if(null == obj) throw new ArgumentNullException(...);
               ...
         }
         public GetPerson(int I)
         {
             ...
         } 
    }