一、堆和栈的区别?
1.GC方面:
- 栈→先进后出→一片连续内存域→系统自动分配和维护,产生的垃圾系统自动释放
- 堆→无序的→不连续的内存域→用户控制释放→不释放的话内存到达一定值时GC回收
2.存储方面
- 栈上通常保存着我们代码执行的步骤,如方法、变量等;而堆上存放的则多是对象,数据等。
- 栈像一堆叠放的盒子,用的时候从最顶部取,调用完毕立即释放;堆像一个仓库,调用完毕不会立即被清理掉。
3.缓存方面:
- 栈→一级缓存→调用完毕立即释放
- 堆→二级缓存→生命周期由垃圾回收算法决定
在内存中,变量会被分配在栈上进行操作。在堆上创建一个对象,会将对象的地址传给栈上的变量,反过来叫变量指向此对象,或者变量引用此对象,也就是栈上的变量指向了堆上地址为XXX的实例(对象)。
二、静态构造函数
- 静态构造函数没有访问修饰符(只能public,但不能写public),也没有参数。
- 在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类。
- 一个类只能有一个静态构造函数。
- 无参构造函数可以与静态构造函数共存。
- 最多只运行一次。
- 静态构造函数不能被继承。
- 如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
- 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。
三、在类的构造函数前加上static会报什么错?为什么?
还是不知道到底报啥错,回去再看= =
看完了:如果本来构造函数前有public,如果这时加上static,“静态构造函数中不允许出现访问修饰符”
构造函数格式为public+类名如果加上 static 会报错(静态构造函数不能有访问、型的对象,静态构造函数只执行一次;
运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;
静态构造函数执行先于任何实例级别的构造函数;
显然也就无法使用this和 base 来调用构造函数。
一个类只能有一个静态函数,如果有静态变量,系统也会自动生成静态函数。