(十四)内存管理和指针

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];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值