76 lines
2.4 KiB
Plaintext
76 lines
2.4 KiB
Plaintext
== Why is this an issue?
|
|
|
|
When using the https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#postfix-increment-operator[postfix increment] operator, it is important to know that the result of the expression `x++` is the value **before** the operation `x`.
|
|
|
|
This means that in some cases, the result might not be what you expect:
|
|
|
|
* When assigning `x++` to `x`, it's the same as assigning `x` to itself, since the value is assigned before the increment takes place
|
|
* When returning `x++`, the returning value is `x`, not `x+1`
|
|
|
|
The same applies to the postfix and prefix https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#decrement-operator---[decrement] operators.
|
|
|
|
== How to fix it
|
|
|
|
To solve the issue in assignments, eliminate the assignment, since `x\++` mutates `x` anyways.
|
|
|
|
To solve the issue in return statements, consider using the https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#prefix-increment-operator[prefix increment] operator, since it works in reverse: the result of the expression `++x` is the value **after** the operation, which is `x+1`, as one might expect.
|
|
|
|
The same applies to the postfix and prefix https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#decrement-operator---[decrement] operators.
|
|
|
|
=== Code examples
|
|
|
|
==== Noncompliant code example
|
|
|
|
[source,csharp,diff-id=1,diff-type=noncompliant]
|
|
----
|
|
int PickNumber()
|
|
{
|
|
int i = 0;
|
|
int j = 0;
|
|
|
|
i = i++; // Noncompliant: i is still 0
|
|
return j--; // Noncompliant: returns 0
|
|
}
|
|
----
|
|
|
|
==== Compliant solution
|
|
|
|
[source,csharp,diff-id=1,diff-type=compliant]
|
|
----
|
|
int PickNumber()
|
|
{
|
|
int i = 0;
|
|
int j = 0;
|
|
|
|
i++; // Compliant: i is incremented to 1
|
|
return --j; // Compliant: returns -1
|
|
}
|
|
----
|
|
|
|
== Resources
|
|
|
|
=== Documentation
|
|
|
|
* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators[Arithmetic operators (C# reference)]
|
|
|
|
=== Articles & blog posts
|
|
|
|
* StackOverflow - https://stackoverflow.com/a/3346729["What is the difference between i++ and ++i in C#?" - Eric Lippert's answer]
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::../message.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::../comments-and-links.adoc[]
|
|
|
|
endif::env-github,rspecator-view[]
|