Mildly Infuriating Warning

I love Visual Studio's code analysis. Quite often it will give quite reasonable advice and save you from getting into a bad habits. But not all advice is made equal. For example, look at CA1805: Do not initialize unnecessarily.

First of all, here is code that triggers it:

Code
int i = 0;

According to documentation "explicitly initializing a field to its default value in a constructor is redundant, adding maintenance costs and potentially degrading performance". I agree on assignment being redundant. However, is it really degrading performance?

If you check IL code generated for non-default assignment (e.g. value 42), you will see ldc.i4.s 42 in .cctor(). If you remove that assignment, the whole .cctor() is gone thus bringing some credibility to the warning.

However, warning was about the default assignment. If you set variable to 0, in IL code you will see EXACTLY the same code as if you left it without the explicit assignment. Despite what warning says, compiler is smart enough to remove the unnecessary assignments on it's own and doesn't need your help. For something that's part of performance rules, there is a significant lack of any performance impact.

I did check more complicated scenarios and there are some examples where code with this rule violation had some difference in IL compared to "fixed" code. However, in my view, that's work for compiler to optimize around - not to raise warning about it. Or alternatively, since it might be a performance issue in those cases, just raise warning when it's an issue and not for everything.


PS: And habit of assigning default values will save your butt in C++ if you are multi-lingual.

Leave a Reply

Your email address will not be published. Required fields are marked *