CA2002: Jangan kunci objek dengan identitas lemah
Properti | Nilai |
---|---|
ID Aturan | CA2002 |
Judul | Tidak mengunci objek dengan identitas yang lemah |
Golongan | Keandalan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Utas mencoba memperoleh kunci pada objek yang memiliki identitas lemah.
Deskripsi aturan
Objek dikatakan memiliki identitas yang lemah ketika dapat diakses secara langsung di seluruh batas-batas domain aplikasi. Alur yang mencoba mendapatkan kunci pada objek yang memiliki identitas lemah dapat diblokir oleh alur kedua di domain aplikasi berbeda yang memiliki kunci pada objek yang sama.
Jenis berikut memiliki identitas yang lemah dan ditandai oleh aturan:
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, gunakan objek dari jenis yang tidak ada dalam daftar di bagian Deskripsi.
Kapan harus menekan peringatan
Aman untuk menekan peringatan jika objek terkunci adalah this
atau Me
dan visibilitas jenis objek mandiri bersifat privat atau internal, dan instans tidak dapat diakses menggunakan referensi publik apa pun.
Jika tidak, jangan menekan peringatan dari aturan ini.
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 CA2002
// The code that's violating the rule is on this line.
#pragma warning restore CA2002
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2002.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Aturan terkait
CA2213: Bidang sekali pakai harus dibuang
Contoh
Contoh berikut menunjukkan beberapa kunci objek yang melanggar aturan.
Imports System
Imports System.IO
Imports System.Reflection
Imports System.Threading
Namespace ca2002
Class WeakIdentities
Sub SyncLockOnWeakId1()
SyncLock GetType(WeakIdentities)
End SyncLock
End Sub
Sub SyncLockOnWeakId2()
Dim stream As New MemoryStream()
SyncLock stream
End SyncLock
End Sub
Sub SyncLockOnWeakId3()
SyncLock "string"
End SyncLock
End Sub
Sub SyncLockOnWeakId4()
Dim member As MemberInfo =
Me.GetType().GetMember("SyncLockOnWeakId1")(0)
SyncLock member
End SyncLock
End Sub
Sub SyncLockOnWeakId5()
Dim outOfMemory As New OutOfMemoryException()
SyncLock outOfMemory
End SyncLock
End Sub
End Class
End Namespace
class WeakIdentities
{
void LockOnWeakId1()
{
lock (typeof(WeakIdentities)) { }
}
void LockOnWeakId2()
{
MemoryStream stream = new MemoryStream();
lock (stream) { }
}
void LockOnWeakId3()
{
lock ("string") { }
}
void LockOnWeakId4()
{
MemberInfo member = this.GetType().GetMember("LockOnWeakId1")[0];
lock (member) { }
}
void LockOnWeakId5()
{
OutOfMemoryException outOfMemory = new OutOfMemoryException();
lock (outOfMemory) { }
}
}