Sesuatu seperti:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Saya percaya itu bukan tempat yang tepat untuk pernyataan kembali, bukan?
Sesuatu seperti:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Saya percaya itu bukan tempat yang tepat untuk pernyataan kembali, bukan?
Seperti yang ditunjukkan beberapa orang secara umum, ini bukan masalah.
Satu-satunya kasus itu akan menyebabkan Anda masalah adalah jika Anda kembali di tengah pernyataan menggunakan dan juga mengembalikan variabel menggunakan. Tetapi sekali lagi, ini juga akan menyebabkan Anda masalah bahkan jika Anda tidak kembali dan hanya menyimpan referensi ke variabel.
using ( var x = new Something() ) {
// not a good idea
return x;
}
Sama buruknya
Something y;
using ( var x = new Something() ) {
y = x;
}
return
pernyataan membuat akhirusing
blok tidak dapat diakses oleh jalur kode apa pun. Ujungusing
blok perlu dijalankan sehingga objek dapat dibuang jika diperlukan.Tidak apa-apa.
Anda tampaknya memikirkan itu
diterjemahkan secara membabi buta ke:
Yang, diakui, akan menjadi masalah, dan akan membuat
using
pernyataan itu agak sia-sia --- itulah sebabnya bukan itu yang dilakukannya.Compiler memastikan bahwa objek dibuang sebelum kontrol meninggalkan blok - terlepas dari bagaimana ia meninggalkan blok.
sumber
Tidak apa-apa - tidak ada masalah sama sekali. Mengapa Anda percaya itu salah?
Pernyataan menggunakan hanyalah gula sintaksis untuk blok percobaan / akhirnya, dan seperti yang dikatakan Grzenio, tidak apa-apa untuk kembali dari blok percobaan juga.
Ekspresi pengembalian akan dievaluasi, maka blok akhirnya akan dieksekusi, maka metode akan kembali.
sumber
Ini akan bekerja dengan sangat baik, sama seperti kembali di tengah
try{}finally{}
sumber
Itu benar-benar dapat diterima. Sebuah menggunakan pernyataan memastikan obyek IDisposable akan dibuang tidak peduli apa.
Dari MSDN :
sumber
Kode di bawah ini menunjukkan cara
using
kerjanya:Keluaran:
Yang dibuang dipanggil setelah pernyataan kembali tetapi sebelum keluar dari fungsi.
sumber
Mungkin tidak 100% benar bahwa ini dapat diterima ...
Jika Anda kebetulan menggunakan sarang dan kembali dari sarang, mungkin itu tidak aman.
Ambil ini sebagai contoh:
Saya melewati DataTable untuk di-output sebagai csv. Dengan kembalinya di tengah, itu menulis semua baris ke aliran, tetapi csv yang dihasilkan selalu hilang satu baris (atau beberapa, tergantung pada ukuran buffer). Ini memberi tahu saya bahwa ada sesuatu yang tidak ditutup dengan benar.
Cara yang benar adalah memastikan semua penggunaan sebelumnya dibuang dengan benar:
sumber