技术开发 频道

.NET 4.0 中的契约式编程

  【IT168 技术文档】契约式编程不是一门崭新的编程方法论。C/C++ 时代早已有之。Microsoft 在 .NET 4.0 中正式引入契约式编程库。博主以为契约式编程是一种相当不错的编程思想,每一个开发人员都应该掌握。它不但可以使开发人员的思维更清晰,而且对于提高程序性能很有帮助。值得一提的是,它对于并行程序设计也有莫大的益处。

  我们先看一段很简单的,未使用契约式编程的代码示例。

// .NET 代码示例
public class RationalNumber
{
    
private int numberator;
    
private int denominator;

    
public RationalNumber(int numberator, int denominator)
    {
        
this.numberator = numberator;
        
this.denominator = denominator;
    }

    
public int Denominator
    {
        
get
        {
            
return this.denominator;
        }
    }
}

  上述代码表示一个在 32 位有符号整型范围内的有理数。数学上,有理数是一个整数 a 和一个非零整数 b 的比,通常写作 a/b,故又称作分数(题外话:有理数这个翻译真是够奇怪)。由此,我们知道,有理数的分母不能为 0 。所以,上述代码示例的构造函数还需要写些防御性代码。通常 .NET 开发人员会这样写:

// .NET 代码示例
public class RationalNumber
{
    
private int numberator;
    
private int denominator;

    
public RationalNumber(int numberator, int denominator)
    {
        
if (denominator == 0)
            
throw new ArgumentException("The second argument can not be zero.");
        
this.numberator = numberator;
        
this.denominator = denominator;
    }

    
public int Denominator
    {
        
get
        {
            
return this.denominator;
        }
    }
}

  下面我们来看一下使用契约式编程的 .NET 4.0 代码示例。为了更加方便的说明,博主在整个示例上都加了契约,但此示例并非一定都加这些契约。

// .NET 代码示例
public class RationalNumber
{
    
private int numberator;
    
private int denominator;

    
public RationalNumber(int numberator, int denominator)
    {
        Contract.Requires(denominator
!= 0, "The second argument can not be zero.");
        
this.numberator = numberator;
        
this.denominator = denominator;
    }

    
public int Denominator
    {
        
get
        {
            Contract.Ensures(Contract.Result
<int>() != 0);
            
return this.denominator;
        }
    }

    [ContractInvariantMethod]
    
protected void ObjectInvariant()
    {
        Contract.Invariant(
this.denominator != 0);
    }
}
0
相关文章