Di kelas saya, saya menerapkan IDisposable sebagai berikut:
public class User : IDisposable
{
public int id { get; protected set; }
public string name { get; protected set; }
public string pass { get; protected set; }
public User(int UserID)
{
id = UserID;
}
public User(string Username, string Password)
{
name = Username;
pass = Password;
}
// Other functions go here...
public void Dispose()
{
// Clear all property values that maybe have been set
// when the class was instantiated
id = 0;
name = String.Empty;
pass = String.Empty;
}
}
Di VS2012, Analisis Kode saya mengatakan untuk mengimplementasikan IDisposable dengan benar, tapi saya tidak yakin apa yang saya lakukan salah di sini.
Teks yang tepat adalah sebagai berikut:
CA1063 Implement IDisposable dengan benar Berikan implementasi Buang (bool) yang dapat ditimpa pada 'Pengguna' atau tandai jenisnya sebagai disegel. Panggilan untuk Buang (salah) seharusnya hanya membersihkan sumber daya asli. Panggilan untuk Buang (benar) harus membersihkan sumber daya yang dikelola dan asli. stman User.cs 10
Untuk referensi: CA1063: Terapkan IDisposable dengan benar
Saya sudah membaca halaman ini, tetapi saya rasa saya tidak begitu mengerti apa yang perlu dilakukan di sini.
Jika ada yang bisa menjelaskan dalam istilah yang lebih panjang tentang apa masalahnya dan / atau bagaimana IDisposable harus dilaksanakan, itu akan sangat membantu!
Dispose
?IDispoable
jika Anda memiliki sumber daya unmanaged untuk membuang (termasuk sumber daya unmanaged yang dibungkus (SqlConnection
,FileStream
, dll). Anda tidak dan tidak harus menerapkanIDisposable
jika Anda hanya memiliki sumber daya dikelola seperti di sini. Hal ini, IMO, masalah besar dengan analisis kode. Ini sangat bagus dalam memeriksa aturan-aturan kecil yang konyol, tetapi tidak pandai memeriksa kesalahan konseptual.Jawaban:
Ini akan menjadi implementasi yang benar, meskipun saya tidak melihat apa pun yang Anda butuhkan untuk membuang kode yang Anda posting. Anda hanya perlu menerapkan
IDisposable
ketika:Tidak ada dalam kode yang Anda poskan yang perlu dibuang.
sumber
using(){ }
kapan pun memungkinkan, tetapi untuk melakukan itu, Anda perlu mengimplementasikan IDisposable, jadi secara umum, saya lebih suka mengakses kelas melalui usings, esp. jika saya hanya perlu kelas dalam satu atau dua fungsiusing
blok ketika kelas mengimplementasikan IDisposable . Jika Anda tidak perlu kelas untuk sekali pakai, jangan terapkan itu. Tidak ada gunanya.using
blok memang cenderung menarik di luarIDisposable
antarmuka saja. Saya membayangkan ada lebih dari beberapa penyalahgunaanIDisposable
hanya untuk tujuan pelingkupan.GC.SuppressFinalize(this);
tidak ada gunanya. Seperti @mariozski menunjukkan finalizer akan membantu untuk memastikan bahwaDispose
dipanggil sama sekali jika kelas tidak digunakan di dalamusing
blok.Pertama-tama, Anda tidak perlu "membersihkan"
string
danint
- mereka akan dijaga secara otomatis oleh pengumpul sampah. Satu-satunya hal yang perlu dibersihkanDispose
adalah sumber daya yang tidak dikelola atau sumber daya yang dikelola yang menerapkanIDisposable
.Namun, dengan asumsi ini hanya latihan pembelajaran, cara yang disarankan untuk diterapkan
IDisposable
adalah menambahkan "tangkapan keselamatan" untuk memastikan bahwa setiap sumber daya tidak dibuang dua kali:sumber
readonly
semantik)Contoh berikut menunjukkan praktik umum terbaik untuk mengimplementasikan
IDisposable
antarmuka. ReferensiPerlu diingat bahwa Anda memerlukan destructor (finalizer) hanya jika Anda memiliki sumber daya yang tidak dikelola di kelas Anda. Dan jika Anda menambahkan destruktor, Anda harus menekan Finalisasi di Buang , jika tidak maka objek Anda akan berada di memori selama dua siklus sampah (Catatan: Baca cara kerja Finalisasi ). Contoh di bawah ini menguraikan semua di atas.
sumber
IDisposable
ada untuk menyediakan sarana bagi Anda untuk membersihkan tidak terkelola sumber daya yang tidak yang tidak akan dibersihkan secara otomatis oleh Pengumpul Sampah.Semua sumber daya yang Anda "bersihkan" adalah sumber daya yang dikelola, dan dengan demikian
Dispose
metode Anda tidak menghasilkan apa-apa. Kelas Anda seharusnya tidak diimplementasikanIDisposable
sama sekali. Pengumpul Sampah akan mengurus semua bidang itu dengan baik sendiri.sumber
Anda perlu menggunakan Pola Pakai seperti ini:
sumber
SafeHandle
(dan sub tipe). Dalam hal sumber daya yang dikelola, penerapan pembuangan yang benar menjadi jauh lebih sederhana; Anda dapat memotong kode menjadi implementasi sederhana darivoid Dispose()
metode ini.Anda tidak perlu melakukan Anda
User
makhluk kelasIDisposable
sejak kelas tidak memperoleh sumber daya non-dikelola (file, koneksi database, dll). Biasanya, kami menandai kelas seolah-IDisposable
olah mereka memiliki setidaknya satuIDisposable
bidang atau / dan properti. Saat menerapkanIDisposable
, lebih baik letakkan menurut skema tipikal Microsoft:sumber
Idisposable diimplementasikan setiap kali Anda ingin pengumpulan sampah deterministik (dikonfirmasi).
Saat membuat dan menggunakan kelas Pengguna, gunakan blok "menggunakan" untuk menghindari memanggil metode buang secara eksplisit:
akhir menggunakan blok yang dibuat objek Pengguna akan dibuang dengan cara implisit metode buang.
sumber
Saya melihat banyak contoh pola Buang Microsoft yang benar-benar anti-pola. Seperti banyak yang telah menunjukkan kode dalam pertanyaan tidak memerlukan IDisposable sama sekali. Tetapi jika Anda ingin menerapkannya di mana, jangan gunakan pola Microsoft. Jawaban yang lebih baik akan mengikuti saran dalam artikel ini:
https://www.codeproject.com/Articles/29534/IDisposable-What-Your-Mother-Never-Told-You-About
Satu-satunya hal lain yang mungkin akan membantu adalah menekan peringatan analisis kode itu ... https://docs.microsoft.com/en-us/visualstudio/code-quality/in-source-suppression-overview?view=vs- 2017
sumber