rspec/rules/S2222/vbnet/rule.adoc
2023-06-12 10:24:02 +02:00

87 lines
2.6 KiB
Plaintext

include::../why-dotnet.adoc[]
== How to fix it
To make sure that a lock is always released correctly, you can follow one of these two methods:
* Use a https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/synclock-statement[`SyncLock`] statement with your lock object.
* Use a https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/try-catch-finally-statement[`Try-Finally`] statement and put the release of your lock object within a https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/try-catch-finally-statement#finally-block[`Finally`] block.
=== Code examples
==== Noncompliant code example
[source,vbnet,diff-id=1,diff-type=noncompliant]
----
Class Example
Private obj As Object = New Object()
Public Sub DoSomethingWithMonitor()
Monitor.Enter(obj) ' Noncompliant: not all paths release the lock
If IsInitialized() Then
' ...
Monitor.Exit(obj)
End If
End Sub
End Class
----
[source,vbnet,diff-id=2,diff-type=noncompliant]
----
Class Example
Private lockObj As ReaderWriterLockSlim = New ReaderWriterLockSlim()
Public Sub DoSomethingWithReaderWriteLockSlim()
lockObj.EnterReadLock() ' Noncompliant: not all paths release the lock
If IsInitialized() Then
' ...
lockObj.ExitReadLock()
End If
End Sub
End Class
----
==== Compliant solution
[source,vbnet,diff-id=1,diff-type=compliant]
----
Class Example
Private obj As Object = New Object()
Public Sub DoSomethingWithMonitor()
SyncLock obj ' Compliant: the lock will be released at the end of the SyncLock block
If IsInitialized() Then
' ...
End If
End SyncLock
End Sub
End Class
----
[source,vbnet,diff-id=2,diff-type=compliant]
----
Class Example
Private lockObj As ReaderWriterLockSlim = New ReaderWriterLockSlim()
Public Sub DoSomethingWithReaderWriteLockSlim()
lockObj.EnterReadLock() ' Compliant: the lock will be released in the finally block
Try
If IsInitialized() Then
' ...
End If
Finally
lockObj.ExitReadLock()
End Try
End Sub
End Class
----
include::../resources-dotnet.adoc[]
* https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/synclock-statement[`SyncLock` statement]
* https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/try-catch-finally-statement#finally-block[`Finally` block]
include::../rspecator.adoc[]