首页 新闻 会员 周边

C#中有关变量默认值的疑惑

0
悬赏园豆:5 [已关闭问题]

在C#中,系统将为每个未经初始化的变量提供一个默认值。对于所有引用类型的变量,默认值是null。所有值类型的变量的默认值是固定的。

问题:既然未初始化的变量都有一个默认值了,那为什么我直接使用未赋值的变量时又会出现:"使用了未赋值的局部变量"这种错误?

问题补充: 不单单是值类型,引用类型如string类型的局部变量不初始化也会报错的.
Ryanism的主页 Ryanism | 初学一级 | 园豆:39
提问于:2009-01-06 10:40
< >
分享
其他回答(7)
0

编译的语法问题

不过也算是一种规范

你给他一个初始值就可以过了

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2009-01-06 10:54
0

局部变量必须初始化..全局变量如果没有初始化,就会按默认值复制给它! 好像C# java 都这样的

Allie | 园豆:707 (小虾三级) | 2009-01-06 11:19
0

局部值类型变量是必须初始化才能用的,如果定义的是全局变量,则没有赋值就会使用默认值,而引用类型的变量不管是全局的还是局部的都可以使用默认里面的默认值

崔小明 | 园豆:210 (菜鸟二级) | 2009-01-06 11:43

你说的有点不太准确,我食言了一下,不管引用类型还是值类型,都是只有全局变量才可以不赋初值,而局部变量,不管是什么类型,都要赋初值。

支持(0) 反对(0) Mr_逗逗 | 园豆:288 (菜鸟二级) | 2015-04-16 11:50
0

局部变量是在堆栈中分配,编译器通常不加入额外代码为局部变量指定默认值,这就会导致局部变量的初始值不确定。这在C/C++代码中表现的尤其明显。C#编译器同样不会为局部变量默认添加一段代码赋予默认值,这往往是从效率上考虑。因为很多代码中对变量只是先声明,然后才使用,如果声明时就复制,势必影响效率,所以编译器把这个控制权放手给了代码编写者。

比如下面例子

int a;

SetA(out a);

这个代码是可以编译通过的,但如果在申明时就对a赋值,显然是多此一举的,这样做只会导致程序执行效率的下降,所以编译器是不会默认给局部变量赋值。

另外局部变量的分配内存的速度很快,只是移动堆栈指针就搞定了,不需要实际分配内存,所以如果做赋值操作,在汇编级别你会发现会比分配内存还要消耗CPU,因为首先要将要赋的值拷贝到寄存器,然后再从寄存器复制到堆栈指针指定的内存地址中。

由于编译器为了效率没有对局部变量赋默认值,那么不对局部变量赋值就使用,将导致不可预料的结果,所以编译器给出错误让代码编写者改正。

 

eaglet | 园豆:17139 (专家六级) | 2009-01-06 11:49
0

楼上正解。

Jerry Qian | 园豆:19 (初学一级) | 2009-01-06 12:05
0

xuexi

Jared.Nie | 园豆:1940 (小虾三级) | 2009-01-06 14:25
0

变量看在哪里,比如你放进了类中定义注意不是方法内部的局部变量,而是类的一个成员,这时候,你写了int i;那么当你new这个类的对象时候,你知道吗,现在在托管堆创建这个对象,那么你定义的这个i被初始化为0,那为什么出现你说的局部变量呢,注意这里局部变量包括值类型和引用类型,局部变量是运行时刻在堆栈存放的,那么这个时候,变量不被初始化。记住,一个变量是不是clr给默认值,关键你看它的位置,在托管堆就可以,不在就不行。

yatasoft | 园豆:235 (菜鸟二级) | 2009-01-06 17:29
0

局部变量是在堆栈中分配,编译器通常不加入额外代码为局部变量指定默认值,这就会导致局部变量的初始值不确定。这在C/C++代码中表现的尤其明显。C#编译器同样不会为局部变量默认添加一段代码赋予默认值,这往往是从效率上考虑。因为很多代码中对变量只是先声明,然后才使用,如果声明时就复制,势必影响效率,所以编译器把这个控制权放手给了代码编写者。

比如下面例子

int a;

SetA(out a);

这个代码是可以编译通过的,但如果在申明时就对a赋值,显然是多此一举的,这样做只会导致程序执行效率的下降,所以编译器是不会默认给局部变量赋值。

另外局部变量的分配内存的速度很快,只是移动堆栈指针就搞定了,不需要实际分配内存,所以如果做赋值操作,在汇编级别你会发现会比分配内存还要消耗CPU,因为首先要将要赋的值拷贝到寄存器,然后再从寄存器复制到堆栈指针指定的内存地址中。

由于编译器为了效率没有对局部变量赋默认值,那么不对局部变量赋值就使用,将导致不可预料的结果,所以编译器给出错误让代码编写者改正。

正解

大艺术家007 | 园豆:202 (菜鸟二级) | 2020-12-30 19:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册