Sometimes when debugging I realize I forget what different values (NULL, TRUE, FALSE, empty strings etc.) looks like when debugging managed code.

If this happens for you as well, here is a quick reference.

 

The application (simple C# console application):

 

namespace Values

{

    class Program

    {

        static bool boolTrue                = true;

        static bool boolFalse               = false;

 

        static bool? nullableBoolTrue       = true;

        static bool? nullableBoolFalse      = false;

        static bool? nullableBoolNull       = null;

 

        static byte byteValue               = 123;

 

        static char charValue               = 'X';

 

        static decimal decimalValue         = 12.34m;

 

        static float floatValue             = 12.34f;

 

        static string stringEmpty           = "";

        static string stringValue           = "abc123"; // Basically the same as an empty string.

        static string stringNull            = null;

 

        static int intValue                 = 123;

 

        static int? nullableIntNull         = null;

        static int? nullableIntValue        = 123;

 

        static AClass referenceNull         = null;

        static AClass referenceNotNull      = new AClass();       

       

        static Point structValue            = new Point(1, 1);

 

        static List<AClass> populatedList   = new List<AClass>() { new AClass { AProp = 100 } };

 

        static void Main(string[] args)

        {

            Program p                   = new Program();

            Console.WriteLine("Paused, break in with WinDbg");

            Console.ReadKey();

        }

    }

 

    public struct Point

    {

        public int x, y;

        public Point(int p1, int p2)

        {

            x = p1;

            y = p2;

        }

    }

 

    public class AClass

    {

        public int AProp { get; set; }

    }

}

 

Build it and run it. Then attach the debugger (32 bit in this example) and load SOS.dll and list out the Program class to see the values:

 

0:004> .load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll

0:004> !do 024ab340

Name:        Values.Program

MethodTable: 002939e8

EEClass:     0029155c

Size:        12(0xc) bytes

File:        C:\Temp\Values\Values\bin\Debug\Values.exe

Fields:

      MT    Field   Offset                 Type VT     Attr    Value Name

6cf16788  4000001       24       System.Boolean  1   static        1 boolTrue

6cf16788  4000002       28       System.Boolean  1   static        0 boolFalse

6cf16700  4000003        4 ...olean, mscorlib]]  1   static 034a325c nullableBoolTrue

6cf16700  4000004        8 ...olean, mscorlib]]  1   static 034a3260 nullableBoolFalse

6cf16700  4000005        c ...olean, mscorlib]]  1   static 034a3264 nullableBoolNull

6cf12748  4000006       2c          System.Byte  1   static      123 byteValue

6cf11f24  4000007       30          System.Char  1   static       58 charValue

6cf0a5b0  4000008       10       System.Decimal  1   static 034a3268 decimalValue

6cf0a424  4000009       34        System.Single  1   static 12.340000 floatValue

6cf0fb08  400000a       20        System.String  0   static 024a1228 stringEmpty

6cf0fb08  400000b       24        System.String  0   static 024ab264 stringValue

6cf0fb08  400000c       28        System.String  0   static 00000000 stringNull

6cf12ad4  400000d       38         System.Int32  1   static      123 intValue

6ceff768  400000e       14 ...Int32, mscorlib]]  1   static 034a326c nullableIntNull

6ceff768  400000f       18 ...Int32, mscorlib]]  1   static 034a3270 nullableIntValue

00293a74  4000010       2c        Values.AClass  0   static 00000000 referenceNull

00293a74  4000011       30        Values.AClass  0   static 024ab280 referenceNotNull

002939a4  4000012       1c         Values.Point  1   static 034a3274 structValue

00293ac8  4000013       34 ....AClass, Values]]  0   static 024ab28c populatedList

 

So here we for example, can see that an empty string (024a1228) and a null string (00000000) is different.
We can also see that a nullable int and an ordinary int are different in the Type department which could be a good clue when debugging.

 

You can just add other types as you want to, hopefully this serves as a start.