I.e. what is the name of the Value Type data structure stored on the stack, that references an object on the heap?
I.e. an object reference is System.What(if anything)?
I know it's not a pointer, or is it?
I know it's "like" a pointer.
I know it is "owned by the garbage collector".
I SUPERSTITIOUSLY believe that when you instantiate an object (i.e. a reference type), that the IL gives the instruction to the CLR to allocate the "stack reference/heap value pair" in memory (e.g.
...
.locals init ([0] int32 i1,
[1] object o1,
[2] int64 l1)
IL_0000: nop
IL_0001: ldc.i4.4
IL_0002: stloc.0
IL_0003: newobj instance void [mscorlib]System.Object::.ctor()
IL_0008: stloc.1
IL_0009: ldloc.0
IL_000a: box [mscorlib]System.Int32
...
) , and that the actual reference is inaccessible at the language or IL level (except for copying/assigning to a new reference or manipulating the referenced object), and that the object reference's allocation is created and managed by the CLR/CLI and the CLR injects an OBJECTREF DWORD value into the stack (or similar).
Please set me straight and put an end to this for all book authors and Google searches.
Thanks!
Reference Types Objects are an example of a reference type. 1var a = new Student(); 2var b = a; csharp. In the above example, both variables a and b will point to the same student object in memory. If we change a , we will also change b .
In C#, classes and interfaces are reference types. Variables of reference types store references to their data (objects) in memory, and they do not contain the data itself. An object of type Object , string , or dynamic is also a reference type. SportsCar sc = new SportsCar(100);
Unlike value types, a reference type doesn't store its value directly. Instead, it stores the address where the value is being stored. In other words, a reference type contains a pointer to another memory location that holds the data.
Use of ref in value types The ref keyword passes the value by reference (details to be explained later). class Program { static void Main(string[] args) { int v1 = 12; methodtoshowref(ref v1); Console. WriteLine(v1); Console. ReadLine(); } public static void methodtoshowref(ref int v2) { v2 = 100; } } C#
Value Type created on the stack does not have a reference to any object on the heap - there is no corresponding object on the heap. This will be only created when value type is boxed - in which case still there will be no relationship between these two.
That is why when you change the value of the boxed reference type, original variable stays the same. Whenever you box, a new object is created.
Here is a simple method:
private void TestBoxing()
{
int i = 52;
object io = i;
io = "something else";
}
And here is the IL code generated:
.method private hidebysig instance void TestBoxing() cil managed
{
// Code size 18 (0x12)
.maxstack 1
.locals init ([0] int32 i,
[1] object io)
IL_0000: nop
IL_0001: ldc.i4.s 52
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: box [mscorlib]System.Int32
IL_000a: stloc.1
IL_000b: ldstr "something else"
IL_0010: stloc.1
IL_0011: ret
} // end of method Program::TestBoxing
As you can see, this .locals init ([0] int32 i, [1] object io)
is nothing but initiating local variables, one int and one object.
I was asking what is the specific type of the reference on the stack which refers to the object on the heap
It is plain object reference, similar to all object references which refers to a point in memory which has a 4 byte type pointer and 4 byte sync block and then rest is as much space as the object requires, in our case int needs 4 bytes so 12 bytes.
Well, I do not think it has a name, it is CLR's internal pointer (32bit or 64bit depending on the runtime) which has no use outside CLR and is not exposed. As you know and said, it is managed by GC since the value will be changing after objects move on the heap after garbage collection.
It's a pointer, sized to the native word length (ie, 32-bit pointer on x86, 64-bit pointer on x64). It doesn't have a CTS-exposed 'type' in the sense that I think you mean.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With