public static void Main(string[] args)
{
int n;
double d;
double calculatedValue = n + d;
}
C# tracks the fact that the local variables n
and d
haven’t been assigned a value and doesn’t allow them to be used in the expression. Compiling this tiny program generates these compiler errors:
Use of unassigned local variable 'n'
Use of unassigned local variable 'd'
By comparison, C# provides a default constructor that initializes the data members of an object to
- 0 for numbers
false
for Booleansnull
for object references
using System;
namespace Test
{
public class Program
{
public static void Main(string[] args)
{
// First create an object.
MyObject localObject = new MyObject();
Console.WriteLine("localObject.n is {0}", localObject.n);
if (localObject.nextObject == null)
{
Console.WriteLine("localObject.nextObject is null");
}
// Wait for user to acknowledge the results.
Console.WriteLine("Press Enter to terminate...");
Console.Read();
}
}
public class MyObject
{
internal int n;
internal MyObject nextObject;
}
}
This program defines a class MyObject
, which contains both a simple data member n
of type int
and a reference to an object, nextObject
(both declared internal
). The Main()
method creates a MyObject
and then displays the initial contents of n
and nextObject
. The output from executing the program appears this way:
localObject.n is 0
localObject.nextObject is null
Press Enter to terminate...
When the object is created, C# executes a small piece of code that the compiler provides to initialize the object and its members. Left to their own devices, the data members localObject.n
and nextObject
would contain random, garbage values.
The code that initializes values when they’re created is the default constructor. It constructs the class, in the sense of initializing its members. Thus C# ensures that an object starts life in a known state: all zeros, nulls, or false values, depending on type. This concept affects only data members of the class, not local variables in a method.