Home > Blogs > Counting on side effects

Counting on side effects

By  Mar 12, 2008

Topics: Programming, Windows Programming

I've long been suspicious of code that depends on side effects, like depending on the order of expression evaluation.  In the past, one had to worry about stuff like this because language standards often didn't specify expression evaluation order, which meant that code that worked when compiled with Microsoft C, for example, wouldn't work when compiled with Borland C (or vice-versa).  I wrote some code like that today in C#, and wondered if it's considered bad practice.

The code in question looks up a value in a dictionary, and then tests a flag in the resulting record--all in a single conditional.  The code looks something like this:

IndexEntry entry;
if (docIndex.TryGetValue(keyValue, out entry) && !entry.IsDeleted)
    // do stuff

I know that the code would work as expected. That is, the call to TryGetValue would be executed before checking the IsDeleted property, and if the item was not found in the collection, the IsDeleted check wouldn't be performed. By that measure, the code is definitely correct.

Now, whether it's clear is another question entirely. Certainly, it would be more clear to write:

IndexEntry entry;
bool bGotRec = docIndex.TryGetValue(keyValue, out entry);
if (bGotRec && !entry.IsDeleted)
    // do stuff

Both do the same thing, and I'm not worried about efficiency, since any optimizing compiler would optimize away the Boolean temporary and end up generating the same code for both. But which is better? Does the addition of that Boolean make the code too verbose? Is the first example too terse?

What do you think?