== Why is this an issue? An assertion is a piece of code that's used during development when the https://learn.microsoft.com/en-us/visualstudio/debugger/how-to-set-debug-and-release-configurations[compilation debug mode is activated]. It allows a program to check itself as it runs. When an assertion is `true`, that means everything is operating as expected. In non-debug mode, all https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.debug.assert[`Debug.Assert`] calls are automatically left out (via the https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.conditionalattribute[`Conditional("DEBUG")`] mechanism). So, by contract, the boolean expressions that are evaluated by those assertions must not contain any https://en.wikipedia.org/wiki/Side_effect_(computer_science)[side effects]. Otherwise, when leaving the debug mode, the functional behavior of the application is not the same anymore. The rule will raise if the method name starts with any of the following `remove`, `delete`, `add`, `pop`, `update`, `retain`, `insert`, `push`, `append`, `clear`, `dequeue`, `enqueue`, `dispose`, `put`, or `set`, although `SetEquals` will be ignored. == How to fix it In the following example, the assertion checks the return value of the remove method in the argument. Because the whole line is skipped in non-debug builds, the call to `Remove` never happens in such builds. === Code examples ==== Noncompliant code example [source,csharp,diff-id=1,diff-type=noncompliant] ---- Debug.Assert(list.Remove("dog")); ---- ==== Compliant solution The `Remove` call must be extracted and the return value needs to be asserted instead. [source,csharp,diff-id=1,diff-type=compliant] ---- bool result = list.Remove("dog"); Debug.Assert(result); ---- == Resources === Documentation * Microsoft Learn https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.debug.assert/[`Debug.Assert` Method] * Microsoft Learn https://learn.microsoft.com/en-us/dotnet/framework/debug-trace-profile/[Debugging, tracing, and profiling] * Microsoft Learn https://learn.microsoft.com/en-us/dotnet/framework/debug-trace-profile/how-to-compile-conditionally-with-trace-and-debug[How to: Compile Conditionally with Trace and Debug] * Microsoft Learn https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/attributes/general#conditional-attribute[Miscellaneous attributes interpreted by the C# compiler - `Conditional` attribute] === Articles & blog posts * Wikipedia https://en.wikipedia.org/wiki/Side_effect_(computer_science)[Side effect (computer science)] ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) === Message Expressions used in "Debug.Assert" should not produce side effects. include::../highlighting.adoc[] ''' == Comments And Links (visible only on this page) === on 28 Mar 2017, 09:38:41 Valeri Hristov wrote: The JAVA implementation checks for certain verbs in the method name: * "remove" * "delete" * "put" * "set" * "add" * "pop" * "update" * "retain" We could add a few more too: * "insert" * "push" * "append" * "clear" * "dequeue" === on 22 May 2017, 14:22:31 Michal Barczyk wrote: Also added "dispose" include::../comments-and-links.adoc[] endif::env-github,rspecator-view[]