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

yewrwe 2014-09-25 10:19:06
如果我有程序如下:

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'

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

我看网上说,.net只在某个版本之后开始会给变量赋默认的初始值,如果我们没有指定值的话。我的问题是:
1 .net是从哪个版本开始支持说,编译器会给出一个初始值,如果我没有指定?
2 这个和工程选项有关吗? 是否可以开启或者关闭这一特性?
3 是否和变量是不是成员变量,是不是局部变量,是不是静态变量有关? 我做了以及简单的实验,似乎类的成员和静态变量都有默认值,而局部变量如果我不赋值的话,编译器就不让我用。
...全文
681 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gusibi 2017-01-12
  • 打赏
  • 举报
回复
值类型的值就是存储在栈中啊 引用类型是将存放本身的值存放在堆中 引用类型是将存放本身的值的地址存放在栈中,根据这个地址可以去找到自己
  • 打赏
  • 举报
回复
1.没听说过 2.与工程无关 3.The C# compiler defines a default (parameterless) constructor if you define a class without expliciting any constructor. And any fields that the constructor doesn't explicitly overwrite are guaranteed to have a value of 0 or null
Forty2 2014-09-26
  • 打赏
  • 举报
回复
根据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点是对的。
a3212b12 2014-09-26
  • 打赏
  • 举报
回复
其实,不管分不分配默认值,自己养成赋值的好习惯。
漫天雪飞 2014-09-26
  • 打赏
  • 举报
回复
值类型的话 是有默认初始值的. 因为是分配在内存堆上面的 引用类型 没有默认值. 内存分配在内存栈上边 变量给予一个初始值的目的是为了在内存上分配一块属于这个变量的地址
我叫小菜菜 2014-09-25
  • 打赏
  • 举报
回复
C# 有构造器。 构造器负责类中成员变量(域)的初始化。C#的类有两种构造器:实例构造器和静态构造器。实例构造器负责初始化类中的实例变量,它只有在用户用new关键字为对象分配内存时才被调用。而且作为引用类型的类,其实例化后的对象必然是分配在托管堆(Managed Heap)上。这里的托管的意思是指该内存受.NET的CLR运行时管理。 [摘]

110,590

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧