可空类型细节:
可空类型可以让值类型的变量设置成null。
值类型默认不能直接设置成null。
要想把值类型设置成null,必须借助可空类型。
int x = 0;
string str = "";
// 以上的这些操作,GC都不会回收,GC只会回收两种类型的数据:null和游离的
int? z = null; // Nullable<T> T是未知类型,是可空类型的泛型写法。可以简写成?这样可以将值类型设为空
double? y = 10; 也可设为其他值
long x1 = 100L;
long? x2 = null;
x2 = x1; 可以为空赋值
// ??空接合运算符。可以用来替换if...else...判断,也可以替换三元运算符,语法比他们都优雅。
// x2为null时,使用??后面的值,不为null时,使用x2的值。
Console.WriteLine(x2 ?? 0); 使用??访问
x1 = x2; // 报错
析构函数的特征:
析构函数只能存在于类中,而不能存在于结构中;
析构函数不能有任何修饰符,包括访问控制修饰符,静态修饰符,抽象修饰符,虚拟修饰符等都不能有;
析构函数没有参数,这就意味着不能有任何重载。
析构函数又称终结器,定义格式:~类名{}
析构函数的调用时机:
析构函数会在对象被垃圾收集器回收时调用,但垃圾收集器有个特点,它是懒惰的,它并不会在变量出了作用域和生命期后立即回收,而是在它认为适当的时候才回收,一般是内存紧张的时候。
可以使用:GC.Collect()强制调用垃圾回收器。
~Stuent()
{
Console.WriteLine("析构函数一般用来回收不再使用的实例。");
Console.WriteLine("垃圾回收器GC会自动调用析构函数。");
Console.WriteLine("开发者一般不建议定义析构函数,默认就有。");
Console.WriteLine("开发者一般不建议调用析构函数,GC进行回收时,GC自动调用。");
}
析构的调用,一般不推荐调用会自动调用
Stuent s = new Stuent(1, "王五");
s = null; // 明确告诉垃圾回收器,s不再使用了,你可以回收。
Stuent s2 = new Stuent(2, "赵六"); // 非游离状态的数据
new Stuent(3, "孙七"); // 游离状态的数据。
// s2还在使用,不为null,不让垃圾回器去回收s2。SuppressFinalize()告诉垃圾回收器不回收。
//GC.SuppressFinalize(s2);
// 一般不建议强制执行GC。GC一般回收为null的变量或游离状态的数据。
//GC.Collect(); // 强制回收