Value vis-a-vis Reference Types
Variables in C# are in 1 of 2 groups. Value types or Reference types. Types like int
and DateTime
are value types. In contrast, any class you create is a reference type. C# strings are also a reference type. Most things in the .NET framework are reference types.
Parts of a Variable
There is the variable name and its value. Two parts.
The variable’s name is what you declare it to be. The value is what you assign to it.
Variables are Initialized
All variables are always given an initial value at the point the variable is declared. Thus all variables are initialized.
For value types, like int
the compiler will give them a valid value if you do not do so explicitly. int
‘s initialize to zero by default, DateTime
‘s initialize to DateTime.MinValue
by default.
Reference type variables initialize to the object you give it. The compiler will not assign an object (i.e. a valid value) if you don’t. In this case the value is null
– nothing. So we say that the reference is initialized to null.
Objects are Instantiated
Humans are born. Objects are instantiated. A baby is an instance of a Human, an object is an instance of some Class.
The act of creating an instance of a Class is called instantiation (Ta-Da!)
So declare, initialize, and instantiate come together like this
MyClass myClassyReference = new MyClass();
In the above, it is wrong to say “… creating an instance of an object…”
edit – inspired by comments discussion
Three distinct things are going on (above) using distinct terminology and that terminology is not interchangeable :
- A reference variable is declared –
MyClass myClassyReference
- An object is instantiated (…from/of a given class, implied) –
new MyClass()
- The object is assigned to the variable.
=
.
Restating the facts:
-
A reference-type variable is also called simply “a reference”. A “value-type variable” is not a reference.
-
This: “objectA is an instance of an object” is profoundly wrong. If objectA was “an instance of objectB” then it must be that objectA begins life with objectB’s type – whatever that is – and current state – whatever that is. What about creating objects D, E, and F as objectB changes? Nay, nay! It is the conceptual and technical case the “objectA is an instance of a Class”. “Instantiation” and “instance of” have precise meaning – an object gets its type, definitions, and values from a Class.
-
MyClass myClassyReference = null
Generally we don’t say “the variable is assigned to null” and we never say “the variable is referencing null”, No. instead we say “the variable is null”; or “the variable is not referencing anything”, or “the reference is null”
Practical Application:
-
I jab my finger at your code and say “this instance has an invalid property. Maybe that’s why the loop fails. You gotta validate parameters during instantiation.” (i.e. constructor arguments).
-
I see this in your code ,
MyClass myClassyReference; myClassyReference.DoSomething();
“You declared the variable but never assigned it. it’s null so it’s not referencing anything. That’s why the method call throws an exception.”
end edit
The Unbearable Lightness of Being
A reference type variable’s name and value exists independently. And I do mean independent.
An instantiated object may or may not have a reference to it.
An instantiated object may have many references to it.
A declared reference may or may not be pointing to an object.