共用方式為


CA2002:請勿鎖定具有弱式識別的物件

型別名稱

DoNotLockOnObjectsWithWeakIdentity

CheckId

CA2002

分類

Microsoft.Reliability

中斷變更

中斷

原因

執行緒嘗試取得具有弱式識別 (Identity) 之物件的鎖定。

規則描述

可以跨應用程式定義域範圍直接存取的物件,即所謂具有弱式識別的物件。 嘗試取得具有弱式識別之物件鎖定的執行緒,可以被不同應用程式定義域中具有相同物件鎖定的第二個執行緒所封鎖。 下列型別具有弱式識別,而且規則會將它們加上旗標:

如何修正違規

若要修正此規則的違規情形,請使用未列於<描述>一節之型別中的物件。

隱藏警告的時機

請勿隱藏此規則的警告。

相關規則

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

範例

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

Imports System
Imports System.IO
Imports System.Reflection
Imports System.Threading

Namespace ReliabilityLibrary

   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
using System;
using System.IO;
using System.Reflection;
using System.Threading;

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

請參閱

參考

lock 陳述式 (C# 參考)

SyncLock 陳述式

Monitor

AppDomain