
Inline adoc files when they are included exactly once. Also fix language tags because this inlining gives us better information on what language the code is written in.
78 lines
2.2 KiB
Plaintext
78 lines
2.2 KiB
Plaintext
== Why is this an issue?
|
|
|
|
In C#, delegates can be added together to chain their execution, and subtracted to remove their execution from the chain.
|
|
|
|
|
|
Subtracting a chain of delegates from another one might yield unexpected results as shown hereunder - and is likely to be a bug.
|
|
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,csharp]
|
|
----
|
|
MyDelegate first, second, third, fourth;
|
|
first = () => Console.Write("1");
|
|
second = () => Console.Write("2");
|
|
third = () => Console.Write("3");
|
|
fourth = () => Console.Write("4");
|
|
|
|
MyDelegate chain1234 = first + second + third + fourth; // Compliant - chain sequence = "1234"
|
|
MyDelegate chain12 = chain1234 - third - fourth; // Compliant - chain sequence = "12"
|
|
|
|
|
|
MyDelegate chain14 = first + fourth; // creates a new MyDelegate instance which is a list under the covers
|
|
MyDelegate chain23 = chain1234 - chain14; // Noncompliant; (first + fourth) doesn't exist in chain1234
|
|
|
|
|
|
// The chain sequence of "chain23" will be "1234" instead of "23"!
|
|
// Indeed, the sequence "1234" does not contain the subsequence "14", so nothing is subtracted
|
|
// (but note that "1234" contains both the "1" and "4" subsequences)
|
|
chain23 = chain1234 - (first + fourth); // Noncompliant
|
|
|
|
chain23(); // will print "1234"!
|
|
----
|
|
|
|
|
|
=== Compliant solution
|
|
|
|
[source,csharp]
|
|
----
|
|
MyDelegate chain23 = chain1234 - first - fourth; // Compliant - "1" is first removed, followed by "4"
|
|
|
|
chain23(); // will print "23"
|
|
----
|
|
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
Review this subtraction of a chain of delegates: it may not work as you expect.
|
|
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
=== on 30 Jun 2015, 16:12:38 Ann Campbell wrote:
|
|
\[~tamas.vajk] I've used a mashup of code samples. Please double-check my work
|
|
|
|
=== on 1 Jul 2015, 07:22:03 Tamas Vajk wrote:
|
|
\[~ann.campbell.2] Added a few more lines to the sample, but otherwise it looks good.
|
|
|
|
|
|
Note: delegate subtraction is not always a bug, so I'm not sure if we can apply the _bug_ label.
|
|
|
|
=== on 1 Jul 2015, 11:28:15 Ann Campbell wrote:
|
|
label updated [~tamas.vajk]
|
|
|
|
=== on 26 Jul 2016, 19:48:47 Ann Campbell wrote:
|
|
\[~tamas.vajk] I think we need to work on this one.
|
|
|
|
endif::env-github,rspecator-view[]
|