All stängning av objekten skall ligga i en finally{} method som tillhör ditt Try-catch block. finally blocket kommer ALLTID att köras, det ser kompilatorn till, vilket gör att även om du skulle få ett fel i ditt catch{} block så kommer stängningen att genomföras om det ligger i ett finally{} block.
Du "skall" alltid göra en close på alla dina objekt, om du missar det så tar GC hand om det, när den tycker att det finns behov för det, men om du gör close() på dina objekt så kommer de att försvinna mycket tidigare än om du inte gör det, och det sparar resurser.
Sedan skall det inte göra någon skillnad om du gör Close() eller dispose() eftersom de enligt praxis skall göra samma sak, men är man orolig att MS inte har koll på sin programmering så gör båda!