Saya menganggap ini sebagai penyalahgunaan pernyataan penggunaan. Saya sadar bahwa saya termasuk minoritas dalam posisi ini.
Saya menganggap ini sebagai pelecehan karena tiga alasan.
Pertama, karena saya berharap "menggunakan" digunakan untuk menggunakan sumber daya dan membuangnya setelah Anda selesai menggunakannya . Mengubah status program tidak menggunakan sumber daya dan mengubahnya kembali tidak membuang apa pun. Oleh karena itu, "menggunakan" untuk mengubah dan memulihkan status adalah penyalahgunaan; kode tersebut menyesatkan bagi pembaca biasa.
Kedua, karena saya berharap "menggunakan" digunakan karena kesopanan, bukan karena kebutuhan . Alasan Anda menggunakan "menggunakan" untuk membuang file setelah selesai bukan karena itu perlu , tetapi karena itu sopan - orang lain mungkin menunggu untuk menggunakan file itu, jadi mengatakan "selesai sekarang "adalah hal yang benar secara moral untuk dilakukan. Saya berharap bahwa saya harus dapat melakukan refaktorisasi "penggunaan" sehingga sumber daya yang digunakan disimpan lebih lama, dan dibuang nanti, dan satu-satunya dampak dari melakukan hal itu adalah sedikit mengganggu proses lainnya . Blok "menggunakan" yang memiliki dampak semantik pada status program disalahgunakan karena menyembunyikan mutasi status program yang penting dan diperlukan dalam sebuah konstruksi yang terlihat seperti itu ada untuk kenyamanan dan kesopanan, bukan kebutuhan.
Dan ketiga, tindakan program Anda ditentukan oleh statusnya; kebutuhan untuk memanipulasi keadaan secara hati-hati adalah alasan mengapa kita melakukan percakapan ini sejak awal. Mari pertimbangkan bagaimana kami dapat menganalisis program asli Anda.
Apakah Anda membawa ini ke tinjauan kode di kantor saya, pertanyaan pertama yang akan saya tanyakan adalah "apakah benar mengunci frobble jika ada pengecualian?" Jelas terlihat dari program Anda bahwa hal ini secara agresif mengunci kembali frobble apa pun yang terjadi. Apakah itu benar? Pengecualian telah dilemparkan. Status program tidak diketahui. Kami tidak tahu apakah Foo, Fiddle atau Bar melempar, mengapa mereka melempar, atau mutasi apa yang mereka lakukan ke keadaan lain yang tidak dibersihkan. Dapatkah Anda meyakinkan saya bahwa dalam situasi yang mengerikan itu selalu hal yang benar untuk dilakukan dengan mengunci kembali?
Mungkin ya, mungkin juga tidak. Maksud saya adalah, dengan kode sebagaimana aslinya ditulis, peninjau kode tahu untuk mengajukan pertanyaan . Dengan kode yang menggunakan "using", saya tidak tahu harus bertanya; Saya berasumsi bahwa blok "menggunakan" mengalokasikan sumber daya, menggunakannya sebentar, dan dengan sopan membuangnya ketika selesai, bukan bahwa kurung kurawal tutup dari blok "menggunakan" mengubah status program saya dalam keadaan luar biasa ketika banyak kondisi konsistensi status program telah dilanggar.
Penggunaan blok "using" untuk mendapatkan efek semantik membuat program ini menjadi fragmen:
}
sangat berarti. Ketika saya melihat satu close brace, saya tidak langsung berpikir "bahwa brace memiliki efek samping yang berdampak luas pada status global program saya". Tetapi ketika Anda menyalahgunakan "menggunakan" seperti ini, tiba-tiba hal itu terjadi.
Hal kedua yang akan saya tanyakan jika saya melihat kode asli Anda adalah "apa yang terjadi jika pengecualian dilemparkan setelah Buka kunci tetapi sebelum percobaan dimasukkan?" Jika Anda menjalankan rakitan yang tidak dioptimalkan, kompilator mungkin telah memasukkan instruksi no-op sebelum mencoba, dan ada kemungkinan pengecualian thread abort terjadi pada no-op. Ini jarang terjadi, tetapi memang terjadi dalam kehidupan nyata, terutama di server web. Dalam hal ini, buka kunci terjadi tetapi kunci tidak pernah terjadi, karena pengecualian dilemparkan sebelum percobaan. Sangat mungkin bahwa kode ini rentan terhadap masalah ini, dan seharusnya ditulis
bool needsLock = false;
try
{
// must be carefully written so that needsLock is set
// if and only if the unlock happened:
this.Frobble.AtomicUnlock(ref needsLock);
blah blah blah
}
finally
{
if (needsLock) this.Frobble.Lock();
}
Sekali lagi, mungkin ya, mungkin tidak, tapi saya tahu untuk mengajukan pertanyaan . Dengan versi "menggunakan", ini rentan terhadap masalah yang sama: pengecualian pembatalan utas dapat dilemparkan setelah Frobble dikunci tetapi sebelum wilayah coba dilindungi yang terkait dengan penggunaan dimasukkan. Tetapi dengan versi "menggunakan", saya berasumsi bahwa ini adalah "jadi apa?" situasi. Sangat disayangkan jika itu terjadi, tetapi saya berasumsi bahwa "menggunakan" hanya untuk bersikap sopan, bukan untuk mengubah status program yang sangat penting. Saya berasumsi bahwa jika beberapa pengecualian pembatalan utas yang buruk terjadi pada waktu yang salah, oh baiklah, pengumpul sampah akan membersihkan sumber daya itu pada akhirnya dengan menjalankan finalizer.