CA2002: Lås inte objekt med svag identitet
Property | Värde |
---|---|
Regel-ID | CA2002 |
Title | Lås inte objekt med svag identitet |
Kategori | Tillförlitlighet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En tråd försöker hämta ett lås på ett objekt som har en svag identitet.
Regelbeskrivning
Ett objekt sägs ha en svag identitet när det kan nås direkt över programdomängränser. En tråd som försöker hämta ett lås på ett objekt som har en svag identitet kan blockeras av en andra tråd i en annan programdomän som har ett lås på samma objekt.
Följande typer har en svag identitet och flaggas av regeln:
Matriser med värdetyper, inklusive integraltyper, flyttalstyper och Boolean.
det här eller Me-objektet
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln använder du ett objekt från en typ som inte finns i listan i avsnittet Beskrivning.
När du ska ignorera varningar
Det är säkert att ignorera varningen om det låsta objektet är this
eller Me
och synligheten för självobjekttypen är privat eller intern, och instansen är inte tillgänglig med någon offentlig referens.
Annars ska du inte ignorera en varning från den här regeln.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2002
// The code that's violating the rule is on this line.
#pragma warning restore CA2002
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2002.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Relaterade regler
CA2213: Disponibla fält ska kasseras
Exempel
I följande exempel visas några objektlås som bryter mot regeln.
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) { }
}
}