Saya mengirim aliran ke metode untuk menulis, dan dalam metode itu saya menggunakan pembaca biner / wrtier. Ketika pembaca / penulis dibuang, baik oleh using
atau hanya ketika itu tidak direferensikan, apakah alirannya ditutup juga ??
Saya akan mengirim BinaryReader / Writer, tetapi saya menggunakan StreamReader juga (mungkin saya harus berkeliling. Saya hanya menggunakannya untuk GetLine dan ReadLine). Ini cukup merepotkan jika menutup aliran setiap kali penulis / pembaca ditutup.
sumber
CA2202 : Microsoft.Usage : Object 'stream' can be disposed more than once in method '...'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.
Haruskah itu diabaikan? Saya tidak mendapatkan pengecualian sejauh ini ...StreamReader
. Peringatan itu terlihat palsu bagi saya, mengingat bahwa dokumen untukIDisposable.Dispose
menyatakan secara eksplisit: "Jika metode Buang objek disebut lebih dari sekali, objek harus mengabaikan semua panggilan setelah yang pertama. Objek tidak boleh membuang pengecualian jika metode Buangnya adalah disebut beberapa kali. "Ini adalah yang lama, tetapi saya ingin melakukan sesuatu yang serupa hari ini dan menemukan bahwa semuanya telah berubah. Sejak .net 4.5, ada
leaveOpen
argumen:Satu-satunya masalah adalah bahwa tidak sepenuhnya jelas apa yang harus ditetapkan untuk parameter lainnya. Berikut ini beberapa bantuan:
Dari halaman msdn untuk StreamReader Constructor (Stream):
Itu hanya daun
detectEncodingFromByteOrderMarks
yang menilai oleh kode sumber adalahtrue
Akan lebih baik jika beberapa dari default itu diekspos atau jika argumennya opsional sehingga kita bisa menentukan yang kita inginkan.
sumber
using (var streamReader = new StreamReader(myStream, Encoding.UTF8, true, 1024, true))
Ya, benar. Anda dapat memverifikasi ini dengan melihat implementasinya dengan Reflector.
sumber
Enam tahun terlambat tapi mungkin ini bisa membantu seseorang.
StreamReader tidak menutup koneksi ketika dibuang. Namun, "menggunakan (Stream stream = ...) {...}" dengan StreamReader / StreamWriter dapat mengakibatkan Stream dibuang dua kali: (1) ketika objek StreamReader dibuang (2) dan ketika blok Stream menggunakan menutup. Ini menghasilkan peringatan CA2202 ketika menjalankan analisis kode VS.
Solusi lain, diambil langsung dari halaman CA2202 , adalah dengan menggunakan blok coba / akhirnya. Pengaturan dengan benar, ini hanya akan menutup koneksi sekali.
Di dekat bagian bawah CA2202 , Microsoft merekomendasikan untuk menggunakan yang berikut:
dari pada...
sumber
Iya. Memanggil Buang () pada dan IDisposable (yang "menggunakan" tidak) harus membuat objek membersihkan semua sumber dayanya. Ini termasuk stream flushing dan menutup deskriptor file mereka.
Jika, dalam kasus Anda, Anda ingin meneruskannya ke metode lain, maka Anda perlu memastikan bahwa metode tersebut tidak melakukan pembacaan / penulisan mereka dalam blok penggunaan.
sumber
Cara mudah untuk memperbaikinya jika perlu adalah dengan menimpa metode StreamWriter kelas Buang. Lihat posting saya di sini untuk mengetahui kode tentang cara melakukannya:
Apakah. Melepaskan StreamWriter menutup arus yang mendasarinya?
sumber
aliran dibuang baik dengan "menggunakan" kata kunci atau panggilan buang secara eksplisit
sumber