Bagikan melalui


CA2216: Jenis sekali pakai harus mendeklarasikan finalis

Properti Nilai
ID Aturan CA2216
Judul Jenis sekali pakai harus mendeklarasikan penyelesai
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Jenis yang mengimplementasikan System.IDisposable, dan memiliki bidang yang menyarankan penggunaan sumber daya yang tidak dikelola, tidak menerapkan finalizer seperti yang dijelaskan oleh System.Object.Finalize.

Deskripsi aturan

Pelanggaran aturan ini dilaporkan jika jenis sekali pakai berisi bidang dari jenis berikut:

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, terapkan finalizer yang memanggil metode Anda Dispose .

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini jika jenis tidak diterapkan IDisposable untuk tujuan melepaskan sumber daya yang tidak dikelola.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh

Contoh berikut menunjukkan jenis yang melanggar aturan ini.

public class DisposeMissingFinalize : IDisposable
{
    private bool disposed = false;
    private IntPtr unmanagedResource;

    [DllImport("native.dll")]
    private static extern IntPtr AllocateUnmanagedResource();

    [DllImport("native.dll")]
    private static extern void FreeUnmanagedResource(IntPtr p);

    DisposeMissingFinalize()
    {
        unmanagedResource = AllocateUnmanagedResource();
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            // Dispose of resources held by this instance.
            FreeUnmanagedResource(unmanagedResource);
            disposed = true;

            // Suppress finalization of this disposed instance.
            if (disposing)
            {
                GC.SuppressFinalize(this);
            }
        }
    }

    public void Dispose()
    {
        Dispose(true);
    }

    // Disposable types with unmanaged resources implement a finalizer.
    // Uncomment the following code to satisfy rule:
    //  DisposableTypesShouldDeclareFinalizer
    // ~TypeA()
    // {
    //     Dispose(false);
    // }
}

CA1816: Panggil GC.SuppressFinalize dengan benar

Baca juga