C#中的析构函数称为终结器(finalizer),实际上是调用Finalize()方法.
1,析构函数
析构函数被调用的时间是不确定的,在C#中,有析构函数的对象要通过2次才能销毁,运行库会使用一个线程来执行所有对象的Finalize()方法,频繁在C#中使用析构函数会对性能有显著影响.
2,IDisposable接口
在C#中,推荐使用System.IDisposable接口代替析构函数.它为释放非托管的资源提供了确定的时间机制.
using(ResourceGobbler theInstance = new ResourceGobbler())
{
//do your processing
}
不安全代码
自由可控非约束的代码,失去监管与保护带来了更搞的灵活性.
unsafe修饰符,可用在类、函数、成员、代码块等前面修饰,标记为不安全代码.但不能把局部变量标记为unsafe.
不可以把类和数组等托管类型声明为指针,因为这会使垃圾回收器出现问题.
checked 关键字不能用于涉及指针的转换, .net假定使用指针指到自己在做什么,不必担心可能出现的溢出.
unsafe
{
int* pX,pY; //相当于C++中的 int *pX, *pY
}
类成员指针
虽然不能创建指向类的指针,但是可以创建指向类成员的指针,但与普通指针稍有不同
fixed(long* pObject = &(myObject.X))
{
do someting
}
//因为对象存储在托管堆上,而垃圾回收器在清理的时候会移动托管堆上的对象,若发生移动,指针指向的内存会失效发生错误,因此需要显示告诉垃圾回收器,对象不可以移动.
*注 通过类成员指针,获取地址并操作sizeof(Object),实际上可以访问整个类的内存.
在栈上分配内存, decimal* pDecimal = stackalloc decimal[10];