C#会对于未赋值的变量/成员变量,给予一个初始值吗?

时间:2022-05-09 10:03:50

如果我有程序如下:

C# code

?

1
2
3
4
5
6
7
    public class My
    {
        public bool b;
        public int i;
    }
    Trace.WriteLine(new My().b.ToString());
    Trace.WriteLine(new My().i.ToString());

那么Trace的打印结果是False, 0
而且我的VS2013的debug/release版的结果打印一致。

而下面这样的代码是编译不过的error CS0165: Use of unassigned local variable 'i'

C# code

?

1
2
    int i;
    Console.WriteLine(i.ToString());

我看网上说,.net只在某个版本之后开始会给变量赋默认的初始值,如果我们没有指定值的话。我的问题是:
1 .net是从哪个版本开始支持说,编译器会给出一个初始值,如果我没有指定?
2 这个和工程选项有关吗? 是否可以开启或者关闭这一特性?
3 是否和变量是不是成员变量,是不是局部变量,是不是静态变量有关? 我做了以及简单的实验,似乎类的成员和静态变量都有默认值,而局部变量如果我不赋值的话,编译器就不让我用。

C# 有构造器。
构造器负责类中成员变量(域)的初始化。C#的类有两种构造器:实例构造器和静态构造器。实例构造器负责初始化类中的实例变量,它只有在用户用new关键字为对象分配内存时才被调用。而且作为引用类型的类,其实例化后的对象必然是分配在托管堆(Managed Heap)上。这里的托管的意思是指该内存受.NET的CLR运行时管理。
[摘]

根据C#语言规范(http://msdn.microsoft.com/zh-cn/library/aa645756%28v=vs.71%29.aspx):
字段(无论是静态字段还是实例字段)的初始值都是字段的类型的默认值(第 5.2 节)...

同样根据C#语言规范(http://msdn.microsoft.com/zh-cn/library/aa691170%28v=vs.71%29.aspx):
...局部变量不自动初始化,因此没有默认值...

因此,你的第3点是对的。

出处http://bbs.csdn.net/topics/390894972