如何检查字段的post条件';D中的旧值是多少?

如何检查字段的post条件';D中的旧值是多少?,d,code-contracts,D,Code Contracts,在C#中,我可以在post条件中使用来检查字段是如何更改的。我怎样才能在D中做到这一点?我已经阅读了文档,但没有提到这一点 具体地说,我正在编写一个页面渲染器,并在一个成员变量中跟踪它在页面下方的距离。我想在out块中断言变量的值至少与开始时一样大(即,它应该向下移动页面,而不是向上移动) 显然,我可以添加另一个字段来保存旧值,并在writeText方法的开始处手动分配它,但我希望框架中有某种东西可以自动完成此操作。不幸的是,没有支持此操作,您必须自己完成。但是您可以在dlang上提出功能请求不

在C#中,我可以在post条件中使用来检查字段是如何更改的。我怎样才能在D中做到这一点?我已经阅读了文档,但没有提到这一点

具体地说,我正在编写一个页面渲染器,并在一个成员变量中跟踪它在页面下方的距离。我想在
out
块中断言变量的值至少与开始时一样大(即,它应该向下移动页面,而不是向上移动)


显然,我可以添加另一个字段来保存旧值,并在
writeText
方法的开始处手动分配它,但我希望框架中有某种东西可以自动完成此操作。

不幸的是,没有支持此操作,您必须自己完成。但是您可以在dlang上提出功能请求

不幸的是,该功能不受支持,您必须自己完成。但是您可以在dlang上请求功能,因为dlang没有语言支持。它之前已经讨论过几次(例如),但我怀疑它是否真的能够实现。如果实现了它(如该线程中所讨论的),则可能会出现代码中断的问题,在一般情况下甚至不可能这样做(特别是,没有通用的方法在D中对变量进行深度复制,因此如果变量不是值类型,则确实没有一种保存该变量原始状态的好方法)。因此,虽然原则上有这样的功能是很好的,但从技术角度来看,这是有问题的,特别是在一种系统语言中,它为您提供了大量的余地,让您可以了解复制类型之类的内容的工作方式


因此,如果您想保存变量的原始状态以便在out契约中进行比较,您需要自己以适合该类型变量的任何方式进行保存。

没有语言支持。它之前已经讨论过几次(例如),但我怀疑它是否真的能够实现。如果实现了它(如该线程中所讨论的),则可能会出现代码中断的问题,在一般情况下甚至不可能这样做(特别是,没有通用的方法在D中对变量进行深度复制,因此如果变量不是值类型,则确实没有一种保存该变量原始状态的好方法)。因此,虽然原则上有这样的功能是很好的,但从技术角度来看,这是有问题的,特别是在一种系统语言中,它为您提供了大量的余地,让您可以了解复制类型之类的内容的工作方式

因此,如果您想保存变量的原始状态以便在out契约中进行比较,那么您需要以适合该类型变量的任何方式自己保存它

class Renderer
{
    private:
        float pos;

    public:
        void writeText(string text)
        in
        {
            assert(text !is null);
        }
        out
        {
            // how to do this?
            assert(pos >= oldPos);
        }
        body
        {
            ...
        }
}