// C#里面引用要多大空间啊 GC堆会无限增长直道内存和虚拟内存全部耗尽,然后系统提出内存不足警告 堆栈的话是有限制,可能弹出StackOverflowFlow异常 一般只要你不用死循环的代码去检查JIT的能力的话,StackOverflowFlow异常是不会出现的// 另外,“如果此值类型有构造函数,则在类型的构造函数起始处执行”这句话有点问题吧。 比如说这样的代码: class Person { DateTime Birthday = new DateTime(xxx); public Person(){} } 编译后就变成了: class Person { DateTime Birthday; public Person() { Birthday = new DateTime(xxx); } } 等价的代码就是这个样子,我是这个意思
或在new的时候(自动赋默认值)
或在new的时候(自动赋默认值)这个肯定不对哦
在C#和VB.NET编译器,值类型总是在线程堆栈上安排空间
这样的话,当程序执行到声明值类型变量的时候,在栈上创建空间对于值类型作为类型的成员的情况:
在new这个对象的时候分配内存空间(在GC Heap),如果此值类型有构造函数,则在类型的构造函数起始处执行可以去分析下IL代码
在方法体中声明的时候分配空间。值类型的话就是分配了这个对象的空间了。引用类型分配存放一个引用的空间。顺便问一下,C#里面引用要多大空间啊?
另外,“如果此值类型有构造函数,则在类型的构造函数起始处执行”这句话有点问题吧。值类型的构造函数是不会在new它所属的引用类型对象的时候执行的。必须另外显式调用。
GC堆会无限增长直道内存和虚拟内存全部耗尽,然后系统提出内存不足警告
堆栈的话是有限制,可能弹出StackOverflowFlow异常
一般只要你不用死循环的代码去检查JIT的能力的话,StackOverflowFlow异常是不会出现的// 另外,“如果此值类型有构造函数,则在类型的构造函数起始处执行”这句话有点问题吧。
比如说这样的代码:
class Person
{
DateTime Birthday = new DateTime(xxx);
public Person(){}
}
编译后就变成了:
class Person
{
DateTime Birthday;
public Person()
{
Birthday = new DateTime(xxx);
}
}
等价的代码就是这个样子,我是这个意思
我也不确定
但是太关心这个问题已经没啥意义了吧
在.NET你不可能不去用GC堆