2009-06-02 13 views
5

Questa potrebbe sembrare una domanda assurda, ma stavo guardando questo perché ho sentito qualcuno affermare che è necessario chiamare Close() su un FileStream, anche se è in un utilizzo block (e hanno un codice dove Close() viene chiamato a destra alla fine del blocco).Implementato come IDisposable su FileStream in .Net 1.1

So che Close() ha lo scopo di chiamare Dispose(), ma ho pensato che avrei un aspetto più approfondito poiché questo è il codice .Net 1.1, e la maggior parte della mia esperienza è stata con 2.0 in poi.

Una cosa che mi ha colpito è che la documentazione MSDN per FileStream ha Dispose() e Dispose (bool) per .Net 2.0, ma solo Dispose (bool) per .Net 1.1.

Ho pensato che potesse essere una svista, quindi ho usato Reflector per esaminare un assieme - e anche lì, vedo Dispose (bool), ma non Dispose().

È corretto? Se è così, qual è la storia qui? FileStream funziona in un blocco using, che pensavo volesse implementare IDisposable che, a mia conoscenza, dichiara Dispose().

C'è una certa magia compilatore in corso, o mi sto perdendo un'implementazione nascosta di Dispose() da qualche parte (che, presumibilmente, chiama Dispose (true) o Dispose (false)?)

Infine (no pun intended), puoi confermare che l'ambito di un FileStream nell'uso del blocco chiuderà il flusso all'uscita dell'ambito in .Net 1.1?

[modifica]

Giusto per chiarire, questo è il codice C#. Capisco che VB.Net non ha ottenuto l'istruzione using fino a .Net 2.0, ma la mia comprensione è che C# ce l'aveva in 1.1 (e il mio codice 1.1 qui ce l'ha e lo compila)

+0

è documentato per la Net 1.1 qui: http://msdn.microsoft.com/en-us/library/yh598w02(VS.71).aspx. Inoltre, ho il codice di fronte a me in VS2003, rivolto a .Net 1.1, che usa i blocchi. – philsquared

+0

deve essere stato VB.NET che lo ha ottenuto in 2.0 quindi .... –

+0

... cioè, il C# che ha come target .Net 1.1 - l'uso è una funzione di linguaggio che, AFAIK, non richiede ulteriore supporto dal runtime. So che VB.Net non l'ha ottenuto fino a .Net 2.0 – philsquared

risposta

9

È implementato un po 'divertente , ma è lì: La classe base per FileStream: System.IO.Stream implementa IDisposable (FileStream lo eredita semplicemente).

La classe del flusso di base implementa Dispose() in modo esplicito, quindi verrà visualizzato Dispose() solo se si esegue il cast dello stream come IDisposeable (che è ciò che utilizza {}).

Stream.Dispose() chiama Stream.Close().

(ottenuto tutto questo via Reflector)

+0

Grazie, JMarsch. Tutto ha un senso. Hai dovuto fare qualcosa di speciale per vederlo in Reflector? Non ho potuto vederlo neanche in Stream (riprenderò domani) – philsquared

+1

Ho avuto problemi anche a trovarlo - all'inizio ero abbastanza confuso! Il trucco sta nel fatto che è implementato in modo esplicito, e suppongo che ciò significhi che non si ordina come ci si aspetterebbe. In Stream, cerca "System.IDisposable.Dispose()". Viene ordinato con le "s" e, per di più, è disattivato, ma è lì. Saluti – JMarsch