When u creates a Reference type and value type object Reference type values are store in the heap
Value types are sore in the stack and in between the both maintain the cross reference between them (if reference contains reference of other object then it will only contain reference of other object in it )
Value type instances are usually allocated on a thread's stack (although they can also be embedded in a reference type object).(boxing and unboxing Concept in .net)
Reference type variables contain the memory address of objects in the heap. By default,when a reference type variable is created, it is initialized to null, indicating that the reference type variable doesn't currently point to a valid object.
When you assign a value type variable to another value type variable, a field-by-field copy is made. When you assign a reference type variable to another reference type variable, only the memory address is copied.
If u want to declare type as value type then check following conditions
Instances of the type are small (approximately 16 bytes or less).
Instances of the type are large (greater than 16 bytes) and are not passed as method parameters or returned from methods.