throw null;where a more verbosely inclined programmer would have written
throw new NullReferenceException();So I set out to find out if these 2 uses indeed are equivalent.
Starting out with the code for our class, the matching generated MSIL and finally the stack trace.
using System;
namespace NullRefernceException
{
public class Class1
{
public void DoSomething()
{
throw null;
}
}
}.method public hidebysig instance void DoSomething() cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: ldnull
IL_0001: throw
} // end of method Class1::DoSomethingSystem.NullReferenceException: Object reference not set to an instance of an object. at NullRefernceException.Class1.DoSomething() in D:\Users\kst\Visual Studio 2010\projects\NullRefernceException\NullRefernceException\Class1.cs:line 8 at NullRefernceException.Class1Tests.DoSomething_TestDriveNullReferenceException_ExceptionThrown() in D:\Users\kst\Visual Studio 2010\projects\NullRefernceException\NullRefernceException\Class1Tests.cs:line 15
And now for the version of the code that is using throw new NullReferenceException
using System;
namespace NullRefernceException
{
public class Class1
{
public void DoSomething()
{
throw new NullReferenceException();
}
}
}.method public hidebysig instance void DoSomething() cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: newobj instance void [mscorlib]System.NullReferenceException::.ctor()
IL_0005: throw
} // end of method Class1::DoSomethingSystem.NullReferenceException: Object reference not set to an instance of an object. at NullRefernceException.Class1.DoSomething() in D:\Users\kst\Visual Studio 2010\projects\NullRefernceException\NullRefernceException\Class1.cs:line 8 at NullRefernceException.Class1Tests.DoSomething_TestDriveNullReferenceException_ExceptionThrown() in D:\Users\kst\Visual Studio 2010\projects\NullRefernceException\NullRefernceException\Class1Tests.cs:line 15
And the test used to drive
using System;
using NUnit.Framework;
namespace NullRefernceException
{
[TestFixture]
public class Class1Tests
{
[Test]
public void DoSomething_TestDriveNullReferenceException_ExceptionThrown()
{
var class1 = new Class1();
try
{
class1.DoSomething();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
}
}
So from a stacktrace point of view it does not look like there is a difference but in IL there is a difference.
After going through this exercise in code I flexed my Google Fu powers :) and found more information at this link on Stackoverflow - Why does C# allow you to 'throw null'?
No comments:
Post a Comment