Reference types and value types are both derived from System.Object. However, value types are treated differently in terms of allocation. When a value type is passed to a ByVal method, the actual value is copied. Also, assigning a value type to another instance of that type causes the value to be copied. The exception occurs when a value type is a reference type's data member; then it is heap allocated right along with the rest of the class.
In the following code fragment, number1 and number2 are two distinct locations in memory that each contain the value 5:
Dim number1 As Integer = 5 Dim number2 As Integer = number1
This contrasts with reference types (classes). Consider the following fragment, in which two objects are instantiated and then one is assigned to the other:
Dim object1 As New Object( ) Dim object2 As New Object( ) object2 = object1
After the assignment, there are no longer two objects; object2 is now a reference to object1. The location in memory formerly associated with object2 is now sitting around waiting to be garbage collected.
Sometimes defining a value type is beneficial—especially when you have small amounts of related data (that consist of value types). A perfect example is the Point structure:
Public Structure Point Public x As Integer Public y As Integer End Structure
Value types always contain known values. The compiler automatically generates a default constructor that is used to initialize all the values of the structure to a ...