2012-10-24 8 views
6

Marshal.DestroyStructure è contrassegnato con l'attributo Pure in .NET Framework ma non sono sicuro del motivo per cui ha chiaramente un effetto sul contesto che lo chiama.Perché Marshal.DestroyStructure è considerato puro?

Lo stato viene modificato (il puntatore viene liberato) anche se non modifica direttamente l'istanza del puntatore stessa.

Nella domanda è implicito: uno sviluppatore può, in buona fede, contrassegnare qualcosa come Pure anche se sa che modifica indirettamente lo stato del contesto?

+0

Dove vedi questo attributo 'Pure'? Non è documentato in questo modo e utilizzando gli strumenti di riflessione non viene mostrato un 'PureAttribute' sul metodo –

+1

@Peter, le annotazioni del Contratto non fanno direttamente parte degli assembly BCL; sono applicati dopo il fatto tramite assemblee di contratto esterne. –

+1

@DanBryant Quindi i Contratti di codice stanno prendendo un'ipotesi sulla Purezza. –

risposta

2

È puro, nel senso che non ha alcun effetto sullo stato gestito visibile, il che significa che, ai fini dei contratti di codice, la chiamata del metodo non può violare gli invarianti di classe.

Certo, è leggermente fuorviante pensare al metodo come puro, poiché ha effetti collaterali, anche se quegli effetti collaterali non sono visibili. Sono osservabili (se provi a usare il puntatore dopo averlo liberato, causerai un errore), ma non esattamente visibile (non puoi dirlo senza cercare di usare il puntatore che qualcosa non va.) Non sono sicuro Qual è stata la motivazione per contrassegnare il metodo Pure, dal momento che non riesco a capire perché sarebbe mai stato utilizzato in un blocco Contratti, ma suppongo che ci sia stata qualche ragione in qualche posto nei contratti BCL che lo richiedevano.

+1

Pure è _esplicitamente_ per evitare effetti secondari osservabili, quindi l'implicazione qui è che hanno semplicemente infranto le proprie regole. Mi piacerebbe davvero sapere perché lo farebbero. Dato che i Contratti sono tutti di "convenienza", non mi sembra la risposta. – Rushyo

+0

@Rushyo, sono d'accordo non è una motivazione particolarmente soddisfacente, ma l'unica altra ragione per cui posso pensare è che è stato un errore. Penso che ci sia una distinzione tra effetti collaterali chiaramente visibili e osservabili indirettamente, che potrebbero spiegare perché è stato contrassegnato come puro. –