zoukankan      html  css  js  c++  java
  • C#会对于未赋值的变量/成员变量,给予一个初始值吗?

    如果我有程序如下:

    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

  • 相关阅读:
    5月26号
    5.17 Quartz笔记
    5.23Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
    5.23@Comfiguration的解释
    5月20号
    5.20
    java与C++不同之处(java不支持特性)
    递归算法之回溯
    0119
    linux打包及备份指令
  • 原文地址:https://www.cnblogs.com/net-sky/p/7406864.html
Copyright © 2011-2022 走看看