Why does foreach allocate int arrays in C#?


Why does Rider DPA say that this code allocates int arrays?

>Solution :

foreach doesn’t itself allocate anything (except space for some locals, which aren’t heap allocations in this case). It is roughly equivalent to:

int result = 0;
using (IEnumerator<int> iter = numbers.GetEnumerator()) {
    while (iter.MoveNext()) {
        var number = iter.Current;
        result |= 1 << (number - @base);
return result;

As you can see: it has literally no direct allocations, but whatever you pass in as numbers has 4 opportunities to do anything it chooses: GetEnumerator(), MoveNext(), Current, and Dispose(). We can’t tell you what the input numbers is, but there’s a good chance that the tool is measuring these invisible allocations and attributing them to the foreach.

Look at whatever numbers is.

Leave a Reply Cancel reply