值类型对象的内存是何时分配的?谢谢

解决方案 »

  1.   

    赋值的时候
    或在new的时候(自动赋默认值)
      

  2.   

    当aa = null后,内存又释放了
      

  3.   

    赋值的时候
    或在new的时候(自动赋默认值)这个肯定不对哦
      

  4.   

    对于在函数内部的情况:
    在C#和VB.NET编译器,值类型总是在线程堆栈上安排空间
    这样的话,当程序执行到声明值类型变量的时候,在栈上创建空间对于值类型作为类型的成员的情况:
    在new这个对象的时候分配内存空间(在GC Heap),如果此值类型有构造函数,则在类型的构造函数起始处执行可以去分析下IL代码
      

  5.   

    恩,听速马大哥这么一说我明白了。
    在方法体中声明的时候分配空间。值类型的话就是分配了这个对象的空间了。引用类型分配存放一个引用的空间。顺便问一下,C#里面引用要多大空间啊?
    另外,“如果此值类型有构造函数,则在类型的构造函数起始处执行”这句话有点问题吧。值类型的构造函数是不会在new它所属的引用类型对象的时候执行的。必须另外显式调用。
      

  6.   

    help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csref
      

  7.   

    // C#里面引用要多大空间啊
    GC堆会无限增长直道内存和虚拟内存全部耗尽,然后系统提出内存不足警告
    堆栈的话是有限制,可能弹出StackOverflowFlow异常
    一般只要你不用死循环的代码去检查JIT的能力的话,StackOverflowFlow异常是不会出现的// 另外,“如果此值类型有构造函数,则在类型的构造函数起始处执行”这句话有点问题吧。
    比如说这样的代码:
    class Person
    {
    DateTime Birthday = new DateTime(xxx);
    public Person(){}
    }
    编译后就变成了:
    class Person
    {
    DateTime Birthday;
    public Person()
    {
    Birthday = new DateTime(xxx);
    }
    }
    等价的代码就是这个样子,我是这个意思
      

  8.   

    .NET里头都是引用,只能说猜测GC上的引用和C++的指针占用的空间一样
    我也不确定
    但是太关心这个问题已经没啥意义了吧
    在.NET你不可能不去用GC堆