我们知道 
包含在类中的变量叫做字段
包含在函数中的变量叫局部变量如果构造了一个类的实例,那么声明在这个类内的字段(值类型\引用类型字段)都自然会被初始化为0或null.
(为引用类型构造实例对象时,系统在托管堆中为实例分配了内存地址并且全部置于0值)问题:
1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??
(我们知道引用类型的new会分配内存,值类型的new仅是调用构造器进行初始化)2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?(像上面堆中那样)3.如果不会自动置于0,那么只能靠构造器来初始化吗?

解决方案 »

  1.   

    to 2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?不一定,看当前值类型变量,如何被初始化的,
    对于c#而言,大多数值类型都是struct来定义的,因此提供默认的构造函数,默认构造函数如何对类型进行初始化,会因类型不同而不同。
      

  2.   

    先谢谢 Knight94(愚翁) 第2问 我的意思可能没有表达清楚
    class Class1
    {
      public int a;
      public int b;
      public Class1(int o)
       {
          a=o;
       }
      static void main()
       { 
       Class1 oo = new Class1(10);
       Console.WriteLine("a={0},b={1}",oo.a,oo.b)
       }
    }
    结果是a=10,b=0 
    b=0并不是Class1()构造器干的
    而是new分配内存地址置0所得 
    如果构造器没有为b字段赋值 
    那么将保持0值
      

  3.   

    to b=0并不是Class1()构造器干的b=0与Class1()构造器没有任何直接关系
    对于int类型来说,默认值为0。
      

  4.   

    to 对于int类型来说,默认值为0。
    属于类成员时会得到默认值0
    但在方法内或者局部声明一个int类型 默认值不会为0
    不会通过编译~提示未赋值to b=0与Class1()构造器没有任何直接关系
    是的没有关系 b=0 不是Class1()干的如果在方法内 构造一个值类型实例
    例如构造一个结构的实例 用默认无参构造器构造
    此时这个结构实例的值 全部未0
    struct ok
    {
      public int x;
      public int y;
    }
    class Class1
    {
      static void main()
      {
        ok xy=new ok();
        Console.WriteLine(xy.x);//为0
        Console.WriteLine(xy.y);//为0
      }
    }
    那么现在x,y的值都为0,是ok()干的吗?
      

  5.   

    首先,你要了解值类型变量的内存分配是在栈上,例如对于如下语句:
    int i;
    来说,系统首先为变量分配4个字节,然后用int类型的默认值来初始化这个4个字节。对于
    struct ok
    {
    public int x;
    public int y;
    }ok tt;
    对于如上来说,系统首先为tt分配8个字节,4个字节为x,另外4个字节为y,然后看ok的默认构造函数是否做了什么特殊的操作来初始化这8个字节,
    如果没有什么特别处理的话,分别转向int类型的默认值来分别初始化x以及y。
      

  6.   

    举个例子
    using System;
    public class test
     {
        public static int a;
        public int b; 
        public test()
        {
          //test类构造器并没有做什么赋值
         }
     }
    public class test2
    {
        static void Main()
        {
          Console.WriteLine(test.a.ToString());
          test tst1 = new test();
          Console.WriteLine(tst1.b.ToString());
          Console.ReadLine();
         }
    }