不变断言是否适合C#编程?

P.B*_*key 7 .net c# java computer-science invariants

在编写工作的书中,作者问"如何在代码中使用不变量".请解释这个问题的含义.

在wiki上看到了类不变量,但是这个例子是用Java编写的,我在Java中并不熟练,不能将这个例子与C#联系起来..NET 4.0引入了不变性,协方差和逆变,这里有很好的解释.不变性如此广泛.作者使用这个词似乎与单元测试相关.对于读过这本书的人来说,作者的意思是什么?我们是在谈论做出假设而只是在单元测试后测试有效性吗?

Cod*_*aos 10

单词不变量并不意味着在某些条件下不会发生变化.有许多不同种类的不变量.例如,在物理学中,光速在lorentz变换下是不变的,即如果更改为参考帧,它不会改变.在编程中也有很多种不变量.有一些类不变量在对象的生命周期内不会改变,方法不变量在函数的生命周期内不会改变,...

类不变量在该类的实例中总是(至少在公开可观察的时间)是真的.

这与共同/反向差异无关.Co-/Contra-variance描述哪些类型可以替换具有不同(通用)参数或返回类型的其他类型.虽然你可以调用一些不变的东西,因为它不支持Co-/Contra-variance,但这是一种与类或方法不变量完全不同的不变性.

例如,某种类型的集合可能具有以下不变量:

  • data!= null
  • 大小> = 0
  • 容量> = 0
  • 大小<=容量

有了这个课程:

class MyCollection<T>
{
  private T[] data;
  private int size;

  public MyCollection()
  {
    data=new T[4];
  }

  public int Size{get{return size;}}
  public int Capacity{get{return data.Length;}}

  [ContractInvariantMethod]
  protected void ClassInvariant()
  {
    Contract.Invariant(data != null);
    Contract.Invariant(Size >= 0);
    Contract.Invariant(Capacity >= 0);
    Contract.Invariant(Size < Capacity);
  }
}
Run Code Online (Sandbox Code Playgroud)

几乎每个班级都有一些不变量,但不是每个人都强制执行..net 4添加了一种使用代码契约来记录和断言它们的好方法.