2012-10-24 14 views
6

Marshal.DestroyStructureは.NET FrameworkのPure属性でマークされていますが、呼び出すコンテキストに明確な影響があるのはなぜか分かりません。Marshal.DestroyStructureが純粋な理由はなぜですか?

ポインタインスタンス自体を直接変更しない場合でも、状態は変更されます(ポインタは解放されます)。

質問には暗黙のうちに、間接的にコンテキストの状態を変更していることがわかっていても、開発者は誠実に何かをPureとマークできますか?

+0

この 'Pure'属性はどこにありますか?この方法では文書化されておらず、リフレクションツールを使用すると、メソッドに「PureAttribute」が表示されません。 –

+1

@Peter、コントラクトアノテーションはBCLアセンブリの一部ではありません。それらは事後に外部契約組合を通じて適用されます。 –

+1

@DanBryant次に、Code Contractsは純度について仮定しています。 –

答えて

2

可視の管理状態に影響を与えないという意味で純粋です。つまり、コード契約の目的で、メソッドを呼び出すとクラス不変条件に違反することはありません。

このような副作用が見えなくても、副作用があるため、このメソッドをPureと考えるのはやや誤解を招きます。彼らは(あなたがそれを解放した後にポインタを使用しようとすると、あなたは失敗を引き起こすでしょう)しかし、正確には見えません(何かが間違っているとポインタを使用しようとしなくてもわかりません)。なぜそれがContractsブロックで使われたのか分からないので、Pureメソッドをマークする動機は何でしたか?しかし、BCL契約のどこかに何らかの理由があったに違いないと思います。

+1

Pureは_observable_副作用を避けるために_explicitly_です。したがって、ここでの意味は、それらが独自のルールを破ったということです。私は本当になぜ彼らがそれをするのか知りたいです。契約がすべて「利便性」に関するものであるとすれば、私は答えとして私を打つことはできません。 – Rushyo

+0

@Rushyo、私はそれが特に満足できる理論的根拠ではないと同意しますが、私が考えることができる唯一の他の理由は間違いだったということです。私は、明らかに目に見えるものと間接的に観察可能なものとの区別があると考えています。なぜそれがPureとマークされたのかを説明することができます。 –

関連する問題