It's only try/finally blocks with empty finally blocks that get optimized
to no try/finally at all.   e.g.

int i = 1;
try
{
 i = 2;
 i = 3;
}
finally
{
  Debug.WriteLine(i);
}

Console.WriteLine(i);

With DEBUG defined, the above code won't be optimized.  With DEBUG not
defined, the C# compiler will emit IL equivalent to:
    int num = 1;
    num = 2;
    num = 3;
    Console.WriteLine(num);

... of course the JIT will optimize that to just Console.WriteLine(3);

Empty catch blocks never cause the C# compiler to optimize away the try

With DEBUG undefined, the following code:
int i = 1;
try
{
 i = 2;
 i = 3;
}
catch(Exception)
{
  Debug.WriteLine(i);
}

...will emit IL equivalent to:
    int num = 1;
    try
    {
        num = 2;
        num = 3;
    }
    catch (Exception)
    {
    }

And--as with DEBUG defined in the try/finally example--the JIT will not
optimize any of it.

-- Peter

On Tue, 7 Aug 2007 09:37:45 -0700, Greg Young <[EMAIL PROTECTED]>
wrote:

>OFF TOPIC:
>Its also interesting because a try {} catch {} is optimized out with
>an empty catch (finally with empty finally) ... this changes the JIT
>compiled code. These changes can have visible side effects ...
>
>as such code like
>
>try {
>}
>catch(Exception Ex) {
>    Debug.Write(Ex);
>}
>
>can have slightly differing behaviors if #DEBUG is enabled.
>
>Personally this is one optimization I could do without :)
>
>Cheers,
>
>Greg
>
>On 8/7/07, Marc Brooks <[EMAIL PROTECTED]> wrote:
>> > Usually when people talk about compiler optimizations they mean the
JIT.
>> > CSC does precious little optimization.
>>
>> Isn't that the truth (of course that feeds my need for speed at compile
time)
>>
>> >
(http://msdn.microsoft.com/msdnmag/issues/05/01/COptimizations/default.aspx
>> > ?side=true#a)
>>
>> VERY interesting reminder tucked in that document, thanks!
>>
>> "A Try-Finally with no code in the Try is left completely alone. This
>> is because the semantics of code executing in a Finally block and
>> outside of it are different. Asynchronous ThreadAbort exceptions
>> (those thrown by another thread) may interrupt the execution of all
>> code, except for code found in Finally blocks."

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to