ValueType
Reference types add indirection. They point to another memory location. Value types do not—they are self-contained, often in the bytes on the evaluation stack.
ValueType
detailsValue types are used constantly in C# programs. Even a simple for
-loop uses an int
value type to iterate. All values are considered structs.
This program shows an int
value type. Int
is stored entirely within stack memory space. The managed heap is not touched—no allocation occurs there.
int
, that memory location's value is changed. No new int
is created as a result of the addition.using System; class Program { static void Main() { int value = 10; value += DateTime.Today.Day; Console.WriteLine(value); } }15
Class
The ValueType
class
is a base class
for all value types. This includes ints, shorts, doubles, and also structs such as DateTime
instances.
ValueType
to refer to these values, and also as a parameter type in methods.ValueType
is a class
, which means it is not a value type itself. It is just a representation of a value type.class
for values, you can refer to those values through a ValueType
reference variable.using System; class Program { static ValueType _valueType = false; static void Main() { // You can refer to System.Int32 as a ValueType. ValueType type1 = 5; Console.WriteLine(type1.GetType()); // You can refer to System.DateTime as a ValueType. ValueType type2 = DateTime.Now; Console.WriteLine(type2.GetType()); // You can refer to System.Boolean as a ValueType. Console.WriteLine(_valueType.GetType()); // Pass as parameter. Method(long.MaxValue); Method(short.MaxValue); } static void Method(ValueType type) { Console.WriteLine(type.GetType()); } }System.Int32 System.DateTime System.Boolean System.Int64 System.Int16
A ValueType
parameter a way to require that an argument is a value type. This is an additional constraint over an object parameter.
class
for all types. In this way it is similar to ValueType
, but ValueType
too is a subclass of object.class
The ValueType
class
may be useful in some programs. It is important as a base class
for actual value types. This is why it has no constructor.
int
, long, short
, DateTime
) and not bother with ValueType
itself.A blittable type is compatible to an unmanaged type. Programs that use blittable types do not need to convert them before passing them to an unmanaged DLL.
byte
boolean.byte
) character.A variable stores a value. In programs, even a reference (pointer) is a value. It is simply a value that points to another value. The ValueType
class
is an important detail.