c# - 不变断言适合 C# 编程吗?

标签 c# java .net computer-science invariants

在书中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/

相关文章:

java - Apache hive 和本地化 DataGrid 的默认寻呼机

引用类型的 C# 7 ref 返回

c# - Outlook 电子邮件中 ​​HTML 页面的格式丢失

c# - 找不到 ServiceHost 指令中的 Service 属性值

java - 请让我知道任何适用于 jdk 1.7 的 MySQL 版本

java - 在 JSF 中调用 JAX-WS

c# - Roslyn AdhocWorkspace 要求引用 System.Runtime

c# - Windows Installer 安装进度状态消息

c# - 如何在一个数据库连接中调用3个不同的存储过程?

c# - 从 C# 中的图标文件创建 System.Windows.Media.ImageSource?