Mengembalikan nilai metode dari dalam pernyataan menggunakan yang mendapat DataContext tampaknya selalu berfungsi dengan baik , seperti ini:
public static Transaction GetMostRecentTransaction(int singleId)
{
using (var db = new DataClasses1DataContext())
{
var transaction = (from t in db.Transactions
orderby t.WhenCreated descending
where t.Id == singleId
select t).SingleOrDefault();
return transaction;
}
}
Tapi saya selalu merasa harus menutup sesuatu sebelum saya keluar dari tanda kurung menggunakan, misalnya dengan mendefinisikan transaksi sebelum pernyataan menggunakan, mendapatkan nilainya di dalam tanda kurung, dan kemudian kembali setelah tanda kurung.
Apakah mendefinisikan dan mengembalikan variabel di luar tanda kurung menggunakan praktik yang lebih baik atau menghemat sumber daya dengan cara apa pun?
Jawaban:
Tidak, saya pikir ini lebih jelas. Jangan khawatir,
Dispose
masih akan dipanggil "di jalan keluar" - dan hanya setelah nilai kembali sepenuhnya dievaluasi. Jika pengecualian dilemparkan pada titik mana pun (termasuk mengevaluasi nilai pengembalian)Dispose
masih akan dipanggil juga.Meskipun Anda tentu saja bisa mengambil rute yang lebih panjang, itu adalah dua baris tambahan yang hanya menambahkan konteks kasar dan ekstra untuk melacak (secara mental). Bahkan, Anda tidak benar-benar membutuhkan variabel lokal tambahan - meskipun bisa berguna dalam hal debugging. Anda bisa saja:
Memang, saya bahkan mungkin tergoda untuk menggunakan notasi titik, dan menempatkan
Where
kondisi dalamSingleOrDefault
:sumber
Lihatlah ini
Memahami pernyataan 'menggunakan' di C #
sumber
Tidak ada efek samping dari kembali dari dalam
using()
pernyataan.Apakah itu membuat kode yang paling mudah dibaca adalah diskusi lain.
sumber
Saya pikir, semua sama saja. Tidak ada yang buruk dalam kode. Kerangka NET. Tidak peduli di mana objek dibuat. Yang penting adalah apakah itu direferensikan atau tidak.
sumber
Ya, bisa ada efek samping. Misalnya, jika Anda menggunakan teknik yang sama dalam metode ASP.NET MVC Action, Anda akan mendapatkan kesalahan berikut: "Contoh ObjectContext telah dibuang dan tidak lagi dapat digunakan untuk operasi yang memerlukan koneksi"
sumber