Pertanyaan Haruskah .Net / C # object call Dispose () pada dirinya sendiri?


Di bawah ini adalah beberapa contoh kode yang ditulis oleh seorang rekan. Ini jelas salah bagi saya, tetapi saya ingin memeriksanya. Haruskah sebuah objek memanggilnya sendiri Membuang() metode dari dalam salah satu metode sendiri? Sepertinya saya hanya pemilik / pencipta objek yang harus dihubungi Membuang() ketika itu dilakukan dengan objek dan bukan objek itu sendiri.

Ini adalah metode web .asmx yang memanggil Membuang() pada dirinya sendiri ketika selesai. (Fakta bahwa itu adalah metode web mungkin kebetulan pertanyaan pada umumnya.) Dalam basis kode kami, kami kadang-kadang instantiate kelas layanan web dalam metode layanan web lain dan kemudian memanggil metode pada mereka. Jika kode saya melakukan itu untuk memanggil metode ini, objek bersulang ketika metode kembali dan saya benar-benar tidak dapat menggunakan objek lagi.

[WebMethod]
public string MyWebMethod()
{
    try
    {
        return doSomething();
    }
    catch(Exception exception)
    {
        return string.Empty;
    }
    finally
    {
        Dispose(true);
    }
}

MEMPERBARUI: Menemukan beberapa tautan yang terkait:

Apakah saya perlu membuang referensi layanan web di ASP.NET?

Buang kelas Proksi Layanan Web?


32
2018-02-18 18:41


asal


Jawaban:


Yang pasti itu bukan prartice yang bagus. Penelepon harus memutuskan kapan dia selesai menggunakan objek IDisposable, bukan objek itu sendiri.


33
2018-02-18 18:47



jika saya pernah melihat itu di salah satu proyek saya, saya akan bertanya mengapa dan saya 99,9999% yakin bahwa saya akan menghapusnya juga

bagi saya ini adalah semacam itu bendera merah / bau kode


4
2018-02-18 18:47



Ada sangat sedikit alasan yang sah untuk melakukan tindakan "Membuang Diri". Threading adalah yang saya gunakan lebih dari tidak.

Saya memiliki beberapa aplikasi yang "memadamkan dan melupakan" utas. Menggunakan metodologi ini memungkinkan objek untuk membuang sendiri.

Ini membantu menjaga kebersihan lingkungan tanpa proses manajer threading.


2
2017-07-24 19:12



Tidak ada batasan teknis tentang apa yang dapat dilakukan oleh metode Dispose. Satu-satunya hal yang istimewa tentang itu adalah Dispose dipanggil dalam konstruksi tertentu (foreach, using). Karena itu, Dispose mungkin cukup digunakan untuk menandai objek sebagai tidak lagi bisa digunakan, terutama jika panggilan itu idempoten.

Saya tidak akan menggunakannya untuk tujuan ini, karena semantik Dispose yang diterima. Jika saya ingin menandai objek sebagai tidak dapat digunakan lagi dari dalam kelas itu sendiri, maka saya akan membuat metode MarkUnusedable () yang dapat dipanggil oleh Dispose atau tempat lain.

Dengan membatasi panggilan ke Dispose ke pola yang diterima umum, Anda membeli kemampuan untuk membuat perubahan pada metode Dispose di semua kelas Anda dengan keyakinan bahwa Anda tidak akan mendobrak kode yang menyimpang dari pola umum.


1
2018-02-18 19:16



Hapus saja, tetapi berhati-hatilah untuk membuangnya di semua objek yang memanggilnya.


0
2018-02-18 19:39



Secara teknis ya, jika itu "metode" adalah finaliser dan Anda mengimplementasikan Finalisasi dan pola IDisposable sebagaimana ditentukan oleh Microsoft.


0
2018-02-18 19:49



Sementara objek. Bersih biasanya tidak akan memanggil Buang pada dirinya sendiri, ada kalanya kode yang berjalan dalam objek mungkin menjadi hal terakhir yang mengharapkan untuk menggunakannya. Sebagai contoh sederhana, jika metode Dispose dapat menangani pembersihan objek yang sebagian dibangun, mungkin berguna untuk memiliki kode konstruktor seperti berikut:

Sub Baru ()
  Dim OK As Boolean = Salah
  Mencoba
    ... lakukan Stuff
    OK = Benar
  Akhirnya
    Jika Tidak OK Maka Saya. Bertindak
  Akhiri Coba
Akhir Sub

Jika konstruktor akan melemparkan pengecualian tanpa kembali, maka objek yang dibangun sebagian, yang dijadwalkan untuk ditinggalkan, akan menjadi satu-satunya hal yang akan memiliki informasi dan dorongan untuk melakukan pembersihan yang diperlukan. Jika tidak peduli memastikan Dispose tepat waktu, tidak ada yang lain.

Berkenaan dengan potongan kode khusus Anda, polanya agak tidak biasa, tetapi terlihat agak seperti cara soket dapat dilewatkan dari satu utas ke yang lain. Ada panggilan yang mengembalikan array byte dan membatalkan Socket; bahwa array byte dapat digunakan di thread lain untuk membuat contoh Socket baru yang mengambil alih aliran komunikasi yang ditetapkan oleh Socket lainnya. Perhatikan bahwa data tentang soket terbuka secara efektif merupakan sumber daya yang tidak dikelola, tetapi tidak dapat dengan baik dibungkus dalam objek dengan finalizer karena sering akan diserahkan kepada sesuatu yang tidak dapat dilihat oleh pengumpul sampah.


0
2018-02-18 20:04



Tidak! Ini adalah perilaku yang tidak terduga dan melanggar pedoman praktik terbaik. Jangan pernah melakukan apa pun yang tidak diekspektasikan. Objek Anda hanya harus melakukan apa yang diperlukan untuk mempertahankan statusnya sambil melindungi integritas objek untuk pemanggil. Penelepon akan memutuskan kapan dilakukan (atau GC jika tidak ada yang lain).


0
2018-02-18 20:19