分享方式:


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

如需詳細資訊,請參閱 如何隱藏程式碼分析警告

CA2213:可處置的欄位應該受到處置

範例

下列範例顯示違反規則的一些物件鎖定。

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) { }
    }
}

另請參閱