Figure 1 Base Class Library Types

C# Primitive Type
BCL Type
Description
sbyte
System.SByte
Signed 8-bit value
byte
System.Byte
Unsigned 8-bit value
short
System.Int16
Signed 16-bit value
ushort
System.UInt16
Unsigned 16-bit value
int
System.Int32
Signed 32-bit value
uint
System.UInt32
Unsigned 32-bit value
long
System.Int64
Signed 64-bit value
ulong
System.UInt64
Unsigned 64-bit value
char
System.Char
16-bit Unicode character
float
System.Single
IEEE 32-bit float
double
System.Double
IEEE 64-bit float
bool
System.Boolean
A True/False value
decimal
System.Decimal
96-bit signed integer times 100 through 1028 (common for financial calculations where rounding errors can't be tolerated)
object
System.Object
Base of all types
string
System.String
String type
Figure 2 Reference Types versus Value Types
// Reference Type (because of 'class')
class  RectRef { public int x, y, cx, cy; }

// Value type (because of 'struct')
struct RectVal { public int x, y, cx, cy; }

static void SomeMethod {
   RectRef rr1 = new RectRef();  // Allocated in heap
   RectVal rv1;                  // Allocated on stack (new optional)
   rr1.x = 10;                   // Pointer dereference
   rv1.x = 10;                   // Changed on stack

   RectRef rr2 = rr1;            // Copies pointer only
   RectVal rv2 = rv1;            // Allocate on stack & copies members
   rr1.x = 20;                   // Changes rr1 and rr2
   rv1.x = 20;                   // Changes rv1, not rv2
}
Figure 3 Boxing
// Declare a value type
struct Point {
   public int x, y;
}

static void Main() {
   ArrayList a = new ArrayList();
   for (int i = 0; i < 10; i++) {
      Point p;                // Allocate a Point (not in the heap)
      p.x = p.y = i;          // Initialize the members in the value type
      a.Add(p);               // Box the value type and add the
                              // reference to the array
   }
   •
   •
   •
}
Figure 4 Manually Boxing Value Types
public static void Main() {
   Int32 v = 5;             // Create an unboxed value type variable

   // When compiling the following line, v is boxed 3 times
   // wasting heap memory and CPU time
   Console.WriteLine(v + ", " + v + ", " + v);

   // The lines below use less memory and run faster
   Object o = v;           // Manually box v (just once)

   // No boxing occurs to compile the following line
   Console.WriteLine(o + ", " + o + ", " + o);
}