为什么Marshal.DestroyStructure被认为是Pure?

Rus*_*hyo 6 .net c# unmanaged code-contracts

Marshal.DestroyStructure在.NET Framework中标有Pure属性,但是我不确定为什么它在调用它的上下文中明显有效.

即使状态没有直接修改指针实例本身,也会修改状态(指针被释放).

问题中隐含的是:开发人员是否真诚地将某些东西标记为纯粹,即使她知道它间接地修改了上下文的状态?

Dan*_*ant 2

它是纯粹的,因为它对可见的托管状态没有影响,这意味着,为了代码契约的目的,调用该方法不能违反类不变量。

诚然,认为该方法是纯粹的有点误导,因为它确实有副作用,即使这些副作用不可见。它们是可观察的(如果您在释放指针后尝试使用它,则会导致失败),但不完全可见(如果不尝试使用指针,您就无法判断出了问题。)我不确定将方法标记为 Pure 的动机是什么,因为我不明白为什么它会在 Contracts 块中使用,但我猜测 BCL 合约深处一定有某种原因需要它。