views:

112

answers:

4

For C# in VS2005, what will be value of variables of the following types if they are simply declared and not assigned to any value? ie. What are their default values?

int
bool
string
char
enum
+9  A: 

Here's what default value for each type you've mentioned would be.

int = 0  
bool = false  
string = null  
char = '\0'  
enum = 0    //behind the scenes enum is int

Taking this forward, at runtime if you wish to capture default value of any type then you can use default statement in C# and simply call it as following.

//This will print 0 on screen.
Console.WriteLine(default(int));

Generally, this is used in generics for identifying default values of generic type arguments, where the type is only known at runtime.

this. __curious_geek
I like the addition of `default`, which I totally neglected in my answer. I'd give you another +1 if I could..
Randolpho
A: 

check the following http://msdn.microsoft.com/en-us/library/83fhsxwc(VS.80).aspx

Space Cracker
+4  A: 

If they're used locally (i.e. they're not members of a class or struct) they won't have default values. You won't be able to use them until they're assigned a value (unless you explicitly "new them up").

If they're not used locally, they'll default to 0, false, null, and '\0'.

Edit: You've added enum to your list. enums default to a value of 0 because they use an int by default behind the scenes. So whatever enumerate is declared as 0 for the enum (typically the first enumerate, but that's overridable) will be the default. If you don't have a 0 value enumerate for whatever reason, then you'll have an invalid value for your enum as the default value.

Please explain. I am talking about declaring the variables inside the scope of a class or method. – Craig Johnston

I told a little white lie to point out how the compiler works. If you declare a local variable, the compiler will not compile if you try to use it without having first explicitly assigning a value to that variable; that includes null for reference types.

For example:

public void Foo()
{
   int bar;
   int barPlus5 = bar + 5; // Compiler Error!
}

Technically, bar still has a default value of 0, but because the C# compiler will not allow you to use that default value in a locally scoped variable, a locally scoped variable effectively doesn't have a default value. <Ben Kenobi>So what I told you was true, from a certain point of view.</Ben Kenobi>.

There are exceptions to the rule: out parameters get a pass because the compiler enforces that an out parameter must be assigned by a method before it returns, and you can do int bar = new int(); to get the default value, since that's technically an assignment.

Now, if you declare a variable as a member of a class or a struct such as follows:

public class Foo
{
    public int Bar {get;set;}
    public Foo() { } 
} 

And then you instantiate Foo somewhere, Bar will have a default value of 0.

For example:

var foo = new Foo();
Console.WriteLine(foo.Bar); // output: 0
Randolpho
Please explain. I am talking about declaring the variables inside the scope of a class or method.
Craig Johnston
@Craig Johnston: I replied via an edit to my answer.
Randolpho
A: 

MSDN article - Value Types.

All value types implicitly declare a public parameterless instance constructor called the "default constructor". The default constructor returns a zero-initialized instance know as the default value for the value type.

In case of local variables (Value or Reference Types) in C#, they must be initialized before they are used.

MSDN Article - Types

A type that is defined as a class, delegate, array, or interface is a reference type. At run time, when you declare a variable of a reference type, the variable contains the value null until you explicitly create an instance of the object by using the new operator, or assign it an object that has been created elsewhere by using new.

adatapost