I'm learning C# and came across this explanation: "When the dice object is referenced in code, the .NET runtime performs a lookup behind the scenes to give the illusion that you're working directly with the object itself." I understand the basic idea that a class is like a recipe and an object is an instance made from that recipe, but the wording about an "illusion" confused me. What exactly are variables, references, objects, and instances in this example?
3 Answers
The runtime manages details that languages such as C or C++ may expose more directly, such as memory allocation, object movement, and reference tracking. You generally do not manually dereference pointers or manage the object's lifetime in ordinary C# code. The object remains available while something still references it, and the garbage collector can reclaim it when nothing does. There is no mysterious alternative way to access the object—the “illusion” simply means C# hides those implementation details behind normal-looking member access.
Imagine drawing an object as a box on a whiteboard and drawing an arrow from `dice` to that box. If you write `otherDice = dice`, both variables point to the same box. Changing the object through either variable changes the same object. But if you later assign a different object to `dice`, only the `dice` arrow moves; `otherDice` still points to the original object. An instance is simply a specific object created from a class.
The wording is more complicated than it needs to be. A class defines the structure and behavior, while an object is a particular instance created from that class. The variable named `dice` usually stores a reference to that object rather than containing the entire object itself. C# lets you use the reference as though you were working directly with the object, while the runtime handles the underlying memory details for you.
So `dice` is basically a label or nickname pointing to a particular object, rather than the object itself? And the object can only be accessed through references like that?

This is also why assigning one reference-type variable to another does not create a copy. Both variables refer to the same instance.