This (possibly see below) stored on the heap, along with all other class data.
It is not stored on the stack, because there really is no point in placing it. Since the value is part of the reference type, it continues to live even after the current procedure exits. However, if it were on the stack, it would be deleted after the stack frame was inserted. This will cause the object to be invalid if some really monumental extra work is not done to try to shuffle it up and down the stack to save it.
In addition, the stack represents a small space and sticking each instance of each type of value ever created in the code will make it work very quickly.
However, the most correct answer is that the data storage location is an implementation detail, so you should assume that you do not know (and cannot). The real difference between reference and value types is built into their names: for value types, operations, such as assigning and passing as arguments, lead to copying the object. For reference types, such operations create an additional reference to the source object.
source share