如果我有程序如下:

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

C#会对于未赋值的变量/成员变量,给予一个初始值吗?的更多相关文章

  1. java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序

    没有父类的情况 1,静态代码块-->静态成员变量-->成员变量(实例属性)-->代码块-->构造函数 2, 静态代码块 和 静态成员变量 只会初始化一次 有父类的情况 1,父类 ...

  2. Android-Java-静态成员变量&成员变量&局部变量(内存图&回收机制)

    静态成员变量(回收机制) StaticDemo 和 MyDemo package android.java.oop13; class MyDemo { /** * 定义一个静态变量 */ public ...

  3. Java 局部变量未初始化会报错,局部变量没有初始值,成员变量有初始值

    Java 成员变量有初始值,而局部变量没有初始值. 如下所示,代码不能编译通过 public static void main(String[] args){     String s;     Sy ...

  4. C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性

    http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...

  5. php 对象赋值后改变成员变量影响赋值对象

    话不多说看代码 打印结果 对obj1的操作 直接影响了obj2 , 对obj2的操作 直接影响了obj1

  6. 利用try-catch判断变量是已声明未赋值还是未声明

    目的是如果一个变量是已声明未赋值,就可以直接赋值,并且不能改变变量的作用域: 如果未声明的话,就重新声明, 在网上搜了下,常见的方法是if(typeof(a)=='undefined'){var a= ...

  7. 利用try-catch判断变量是已声明未声明还是未赋值

    原文 利用try-catch判断变量是已声明未声明还是未赋值 这篇文章主要介绍了利用try-catch判断变量是已声明未赋值还是未声明,需要的朋友可以参考下 目的是如果一个变量是已声明未赋值,就可以直 ...

  8. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  9. Java:全局变量(成员变量)与局部变量

    分类细则: 变量按作用范围划分分为全局变量(成员变量)和局部变量 成员变量按调用方式划分分为实例属性与类属性 (有关实例属性与类属性的介绍见另一博文https://blog.csdn.net/Drag ...

随机推荐

  1. RabbitMQ性能优化

    修改rabbitmq.config文件 rabbitmq.config文件时rabbitmq的配置文件,他遵守Erlang配置文件定义. rabbitmq.config文件位置: Unix $RABB ...

  2. arcengine直连sde

    搞了半天,找了好多资料,实验好多次,终于解决.参考资料:http://www.cnblogs.com/gaxin/p/5777864.html

  3. day 0313函数的初识

    1.函数的定义: 定义:def 关键词开头,空格之后接函数名和圆括号(),还有最后一个‘:’ def是固定的,定义函数的关键字. 空格-是为了将关键字和函数名分开,必须有的. 函数名:只能包括字符串, ...

  4. 图->存储结构->邻接多重表

    文字描述 邻接多重表是无向图的另一种链式存储结构. 虽然邻接表是无向图的一种很有效的存储结构,在邻接表中容易求得顶点和边的各种信息. 但是,在邻接表中每一条边(vi,vj)有两个结点,分别在第i个和第 ...

  5. 洛谷P3237 米特运输 [HNOI2014] hash/二进制分解

    正解:hash/二进制分解 解题报告: 传送门! umm首先提取下题意趴QAQ 大概是说给一棵树,每个点有一个权值,要求修改一些点的权值,使得同一个父亲的儿子权值相同,且父亲的权值必须是所有儿子权值之 ...

  6. 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈

    正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...

  7. js 进制之间的转换

    //十进制转其他 var x=110; alert(x); alert(x.toString(8)); alert(x.toString(32)); alert(x.toString(16)); // ...

  8. GBDT原理学习

    首先推荐 刘建平 的博客学习算法原理推导,这位老师的讲解都很详细,不过GBDT的原理讲解我没看明白, 而是1.先看的https://blog.csdn.net/zpalyq110/article/de ...

  9. Linux中安装python3

    [centos7中安装python3]http://blog.csdn.net/wjqwinn/article/details/75633714 (一)安装python3前的准备工作1.修改文件中第一 ...

  10. 对Python源码加密及反编译前后对比

    关于python的加密 目前软件开发商对 Python 加密时可能会有两种形式,一种是对python转成的exe进行 保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举两种形式的保护流程. ...