in fact both loop will have an empty body when compiled!
to make the second loop behave, you will have to remove the (object)
casting
this is what it look like when I compile your code,
public struct MyStruct
{
}
class Program
{
static void Main(string[] args)
{
test1();
test2();
}
public static void test1()
{
Stopwatch sw = new Stopwatch();
bool b;
MyStruct s;
for (int i = 0; i < 100000000; i++)
{
b = (object)s == null;
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
public static void test2()
{
Stopwatch sw = new Stopwatch();
bool b;
MyStruct? s = null;
for (int i = 0; i < 100000000; i++)
{
b = (object)s == null;
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
}
IL:
the MyStruct (empty since you didn't provide any)
.class public sequential ansi sealed beforefieldinit ConsoleApplication1.MyStruct
extends [mscorlib]System.ValueType
{
.pack 0
.size 1
} // end of class ConsoleApplication1.MyStruct
the first loop in your example
.method public hidebysig static
void test1 () cil managed
{
// Method begins at RVA 0x2054
// Code size 17 (0x11)
.maxstack 2
.locals init (
[0] valuetype ConsoleApplication1.MyStruct s,
[1] int32 i
)
IL_0000: ldc.i4.0
IL_0001: stloc.1
IL_0002: br.s IL_0008
// loop start (head: IL_0008)
IL_0004: ldloc.1
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: stloc.1
IL_0008: ldloc.1
IL_0009: ldc.i4 100000000
IL_000e: blt.s IL_0004
// end loop
IL_0010: ret
} // end of method Program::test1
the second loop
.method public hidebysig static
void test2 () cil managed
{
// Method begins at RVA 0x2074
// Code size 25 (0x19)
.maxstack 2
.locals init (
[0] valuetype [mscorlib]System.Nullable`1<valuetype ConsoleApplication1.MyStruct> s,
[1] int32 i
)
IL_0000: ldloca.s s
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<valuetype ConsoleApplication1.MyStruct>
IL_0008: ldc.i4.0
IL_0009: stloc.1
IL_000a: br.s IL_0010
// loop start (head: IL_0010)
IL_000c: ldloc.1
IL_000d: ldc.i4.1
IL_000e: add
IL_000f: stloc.1
IL_0010: ldloc.1
IL_0011: ldc.i4 100000000
IL_0016: blt.s IL_000c
// end loop
IL_0018: ret
} // end of method Program::test2
struct
benull
? DOES NOT COMPUTE!!! – Rosetta