Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why aren't unassigned local variables automatically initialized?

It seems like there is no way to have unassigned local variables in your code or check for them, as the compiler spits out Use of unassigned local variable error.

Why is the compiler not using default(T) on these variables at compile time?

Even if it's harder to do for value types, references types could easily be initialized to null in this case, right?

Here is some test code:

public void Test ( )
{
    int x;
    string s;

    if ( x == 5 )
        Console.WriteLine ( 5 );

    if ( s != null )
        Console.WriteLine ( "s" );
}

which returns:

Use of unassigned local variable 'x'
Use of unassigned local variable 's'

UPDATE:

For people who claims this is not allowed for a good reason, why is it allowed on a class level?

public class C
{
    public int X;
    public string S;

    public void Print ( )
    {
        Console.WriteLine ( X );
        Console.WriteLine ( S );
    }
}

This code compiles perfectly fine.

Why is it fine to have on a class level but not on a method level?

like image 905
Joan Venge Avatar asked Oct 17 '11 17:10

Joan Venge


1 Answers

I see you've updated your question, so I'll update my answer. Your question has two parts, one relating to local variables and the other to instance variables on a class instance. First, however, this isn't really a compiler design decision, but rather a language design decision.

Spec Section 12.3.1/12.3.2

Local Variables

We know why you can define a variable without giving it a value. One reason, an example of something like this:

int x;
// do stuff
x = 5;  // Wow, I can initialize it later!
Console.WriteLine(x);

The standard defines why this is valid code. Now, I'm not on the C# design team, but it makes good sense why they wouldn't automatically initialize the code for you (besides the performance hit when you actually didn't want it to be automatically initialized).

Say the code above was your intention, but you forgot to initialize x = 5;. If the compiler had automatically initialized the variable for you, the code would compile, but it would do nothing like you would expect.

Granted this is a trivial example, but this was a very good design decision from the language designers, as it would save many headaches trying to figure out why something wasn't working as expected.

As a side note, I can't think of a reason why you would want to define the code without assigned something to it, or use the default value (in every case), to me that would likely be a bug, which I'm sure is what the compiler designers may have determined.

Class Instance Variables

Class level members are defined by the standard to be initially assigned. In fact, to be fair, local variables outside those declared in a catch, foreach or using statement are initially unassigned. So really, this is a standards issue, not a compiler issue.

If I were to try and guess why this is the case with regards to instance variables of class instances, I would say it has to do with how the memory is allocated on the heap, since that is where the classes are allocated. When a class is allocated on the heap, all of its members have to be initialized and allocated on the heap with it. It's not just ok to do it in a class member than a local variable, it has to be done this way. They simply cannot be left unassigned.

like image 104
Christopher Currens Avatar answered Nov 01 '22 22:11

Christopher Currens