CA2002:不要鎖定具有弱式識別的物件
屬性 | 值 |
---|---|
規則識別碼 | CA2002 |
標題 | 不要鎖定具有弱式識別的物件 |
類別 | 可靠性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | No |
原因
執行緒會嘗試取得具有弱式身分識別之物件的鎖定。
檔案描述
可以跨應用程式定義域範圍直接存取的物件,即所謂具有弱式識別的物件。 嘗試取得具有弱式識別之物件鎖定的執行緒,可以被不同應用程式定義域中具有相同物件鎖定的第二個執行緒所封鎖。
下列類型具有弱式身分識別,並由規則標示:
如何修正違規
若要修正此規則的違規,請使用不在 [描述] 區段中清單中之類型的 物件。
隱藏警告的時機
如果鎖定的物件為 或 Me
,且自我物件類型的可見度為 this
私用或內部,且無法使用任何公用參考存取實例,則隱藏警告是安全的。
否則,請勿隱藏此規則的警告。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable CA2002
// The code that's violating the rule is on this line.
#pragma warning restore CA2002
若要停用檔案、資料夾或專案的規則,請在組態檔 中將其嚴重性設定為 。 none
[*.{cs,vb}]
dotnet_diagnostic.CA2002.severity = none
如需詳細資訊,請參閱 如何隱藏程式碼分析警告 。
相關規則
範例
下列範例顯示違反規則的一些物件鎖定。
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) { }
}
}