在书中coders at work ,作者问“你如何在代码中使用不变量”。请解释这个问题的含义。
我看到类不变量 on wiki ,但是这个例子是用 Java 写的,我的 Java 不够熟练,无法将这个例子与 C# 联系起来。 .NET 4.0 引入了不变性、协变性和逆变性,并得到了很好的解释 here.不变性是如此广泛。作者对这个词的使用似乎与单元测试有关。对于那些读过这本书的人来说,作者的意思是什么?我们是在谈论做出假设并在单元测试后简单地测试有效性吗?
最佳答案
“不变”这个词不仅仅意味着某些东西在特定条件下不会改变。有许多不同种类的不变量。例如,在物理学中,光速在洛伦兹变换下是不变的,即如果您更改为引用系,它也不会改变。在编程中也有很多种不变量。有些类不变量在对象的生命周期内不会改变,方法不变量在函数的生命周期内不会改变,...
类不变量是指在该类的实例中始终(至少在公开可观察的时间)为真。
这与协方差/逆方差没有任何关系。 Co-/Contra-variance 描述了哪些类型可以替换为具有不同(通用)参数或返回类型的其他类型。虽然您可以调用不变量,因为它不支持 Co-/Contra-variance,但这是一种与类或方法不变量完全不同的不变性。
例如,某种集合可能具有以下不变量:
- 数据 != 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);
}
}
几乎每个类都有一些不变量,但并不是每个人都强制执行它们。 .net 4 添加了一种使用代码契约记录和断言它们的好方法。
关于c# - 不变断言适合 C# 编程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4585690/