debug vs. release in C#

A question came up on an internal DL about checking if an assembly was debug or release. I’m always looking for something to spout about, and this seemed like a good one.

There are 3 things people typically identify as the difference between debug & release. You need to decide which one you’re interested in:

“DEBUG” preprocessor flag. Can be set on the whole assembly/netmodule with ‘csc /define’, or on a whole file with #define.

Debugging information (pdb).   Set with ‘csc /debug[+|-]’. It doesn’t affect codegen, so it’s really not very interesting.

Optimization.   Set with ‘csc /optimize[+|-]’. In managed code, the JITter in the runtime does nearly all the optimization. The difference in generated IL from this flag is pretty small. The Whidbey C# compiler has more a difference on this flag than previous versions, but it’s still not much.

I don’t know of a way to ask what preprocessor flags were set for compiling a bit of code, but I would start my search by thinking about how they are applied at the file and assembly/netmodule scopes.