The Build tab of the Project Properties in Visual Studio 2005/2008 contains the "Optimize code".
The documentation states that it "... enables or disables optimizations performed by the compiler to make your output file smaller, faster, and more efficient."
- My question is why should I NOT have it on?
- Why is it not on by default?
- What does it actually do?
Have a look at the answers to What is /optimize C# compiler key intended for? They answer your questions (especially Noldorin's answer).
You wouldn't want this on for a debug built, as it makes stepping through code harder as the actual code that is running may not properly reflect what you have written (since some lines will be optimized out)
It is not on by default for DEBUG builds for the above reason, it should be enabled by default on release builds
It performs optimizations such as dynamic inlining and removing unneeded local variables. Any sort of optimization that can be decided upon at compile time.
Wikipedia has an article on compiler optimization that covers many of the basic types of optimizations.
You don't want to create optimized debug builds. Optimization affects the debugabbility of your code - some lines of code may be removed, some lines of code from different parts of a function or from different functions may be merged together, local variables may be folded together, and so on. This means when debugging your current line can appear to jump around randomly due to the code being reorganized and inspecting local variables can be very misleading - the space for a local might be reused when it is no longer needed and appear to give a jibberish result.