Question:
After all, a class is a reference type, and variables in a class can be types by value. For instance:
class Car
{
public int maxSpeed;
public Car(int max)
{
maxSpeed = max;
}
}
Where is maxSpeed
stored – on the stack or on the heap?
Answer:
The question itself is caused by two problems
- a fairly common, but generally incorrect statement "value-type variables are stored on the stack"
- a little confusion in terminology – class fields are not "variables" – not local variables.
The point is that at the C # language level there is no concept of "stack" and "heap". There are two kinds of types:
- Reference. The value of a variable or field of a class of this type stores the memory address at which an instance of the type is located. The instance itself is usually in the heap. An example is strings.
- Value-types The value of a variable or class field stores the value directly. An example is int.
The concept of a stack is at the .NET / IL level. Local variables in IL .NET layer methods are stored on the stack. A C # variable does not always turn into an IL method variable. This happens if:
- there are no closures to it
- it is declared in a non-async method
- there are still many different conditions caused by the implementation peculiarities of a particular C # compiler.
Type fields are stored as part of the type instance itself. They physically lie in the piece of memory that is allocated for a specific instance of the type. Those. if the instance itself is on the stack (for example, it is an instance of a structure), then the field is stored on the stack. If the instance is in the heap, then the field is also in the heap.
Specific examples
- The method declares
int a
– it lies right on the stack - The method declares
string s
– the variable on the stack contains the address of the string in the heap. - The method declares
Car c
– the address of the Car object is in the variable on the stack. The object itself lies on the heap. Part of the object in the heap is the maxSpeed field, which contains the speed value. - The method declares
int [] arr
– the address of the array in the heap is in the variable on the stack. The values of individual cells lie directly in the array object in the heap. - A
Point
structure withX
/Y
fields is declared. The variablePoint p
is declared in the method – the structure itself, with all the fields, is in the variable on the stack.