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

不变断言是否适合C#编程?,c#,java,.net,computer-science,invariants,C#,Java,.net,Computer Science,Invariants,在书中,作者问“如何在代码中使用不变量”。请解释这个问题的意思 我看到了类不变量,但是这个例子是用Java编写的,我对Java的掌握还不够熟练,无法将这个例子与C#。NET4.0引入了不变性、协方差和逆方差,并且很好地解释了不变性是如此广泛。作者使用这个词似乎与单元测试有关。对于那些读过这本书的人来说,作者是什么意思?我们是说在单元测试之后做一个假设并简单地测试有效性吗?在这种情况下,不变量指的是应用于参数的条件,并且在函数/方法的整个生命周期内保持不变 发件人: 在计算机科学中,谓词被称为操作

在书中,作者问“如何在代码中使用不变量”。请解释这个问题的意思


我看到了类不变量,但是这个例子是用Java编写的,我对Java的掌握还不够熟练,无法将这个例子与C#。NET4.0引入了不变性、协方差和逆方差,并且很好地解释了不变性是如此广泛。作者使用这个词似乎与单元测试有关。对于那些读过这本书的人来说,作者是什么意思?我们是说在单元测试之后做一个假设并简单地测试有效性吗?

在这种情况下,不变量指的是应用于参数的条件,并且在函数/方法的整个生命周期内保持不变

发件人:

在计算机科学中,谓词被称为操作序列的不变量,前提是:如果谓词在序列开始前为真,那么在序列结束时为真


在.NET中,可以使用检查/强制执行不变量。

本文中的含义与C#4中引入的泛型的协变和逆变无关,而是与您链接到的wikipedia文章的含义相同。在C语言中,这可以是调试断言(即
debug.Assert(condition)
)以及代码契约库。例如,有一个
contracinvariantMethodAttribute
,可以应用于类中断言类不变量的方法:

[ContractInvariantMethod]
protected void ClassInvariant()
{
    Contract.Invariant(someCondition);
}

Wiki中的那个例子是用JML实现不变量,这是一种非常具体、奇特、也许经过深思熟虑的研究技术,但它根本不是必要的主流。而且,这不仅仅是在谈论不变量,而是在谈论断言一个变异体做了预期的事情,这不是我想到不变量时想到的。我还没有读过《工作中的程序员》,但我怀疑《工作中的程序员》中是否有人使用过JML

无论如何,我一直认为不变量是一种很好的方法,可以“尽早崩溃”,防止代码在程序状态处于不合理(计划外)状态时尝试做合理的事情

C#代码中不变量的一个很好的例子可能是永远不要将对象交给N-Hibernate保存,除非该对象传递了它的不变量,为了防止非感官数据进入数据库,不变量应该有很多。让我们看看我是否能想出其他的例子

  • 假设您有一个用户类 总是应该有一个初选 电子邮件地址属性,然后为 保存前检查可能是为了 确保电子邮件地址字段不是空的。 否则,其他应用程序逻辑 沿着这条路走下去 所有人都有电子邮件地址 用户在尝试时可能会出错 稍后向用户发送电子邮件

  • 进一步假设一个用户对象 “有许多”电子邮件对象,假设 这对一个年轻人来说毫无意义 没有拥有用户的电子邮件,然后 Email类上的一个不变量 可能是为了确保电子邮件的引用 其用户始终不为空,否则为空 您有一个孤立的电子邮件对象 可能导致空指针异常 当您试图提及电子邮件的所有者时

  • 假设您正在编写一个GUI 应该显示状态 Amazon S3对象在常规 WPF表格。形式上的不变量 可能是为了确保表单 正确地绑定到其对象 在执行任何事件处理程序之前 在那张表格上

  • 假设你在写StackOverflow。 这里的一个不变量可能是确保用户的 声誉水平从来都不是负面的,甚至是负面的 如果用户受到声誉惩罚。 负面声誉可能会破裂 这些漂亮的图形将体验呈现为 时间的函数(除非准备好这些图表 绘制0 y轴下方的线的步骤 很可能是


至于何时检查不变量,您可以在任何改变数据状态的方法结束时进行检查。在最具攻击性和偏执的防御性编程中,您可以在所有方法之前和之后检查一个不变量。

不变量一词并不意味着在某些条件下不会发生变化。不变量有很多种。例如,在物理学中,光速在洛伦兹变换下是不变的,也就是说,如果你改变参考系,光速不变。在编程中,不变量也有很多种。有些类不变量在对象的生命周期内不会改变,有些方法不变量在函数的生命周期内不会改变

类不变量是在该类的实例中始终(至少在公开可观察的时间)为真的东西

这与协方差/抵销方差无关。协方差/反方差描述了哪些类型可以替换具有不同(通用)参数或返回类型的其他类型。虽然您可以将某个对象称为不变量,因为它不支持协方差/逆方差,但这是一种与类或方法不变量完全不同的不变性

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

[ContractInvariantMethod]
protected void ClassInvariant()
{
    Contract.Invariant(someCondition);
}
  • 数据!=空的
  • 大小>=0
  • 容量>=0
  • 尺寸=0); 合同不变(容量>=0); 合同不变(尺寸<容量); } }
    几乎每个类都有一些不变量,但并不是每个人都强制执行它们。net 4增加了一种很好的方法,可以使用代码契约来记录和断言它们。

    我认为你不需要阅读这本书来理解我的问题,但作者提出问题的方式是“事实问题”或“你如何使用这些东西”,就好像每个人都这样做一样。我从来没有故意使用不变量来做任何用途,在.NET中,我们似乎需要一个离墙属性来考虑它们。那么,不变量的常见用法是过去的事了,还是仅限于assembly/C/C++?@P.Brian.Mackey?我也从未使用过它们,但是,似乎那些来自