引用数据类型php
void DoWork()
{
Customer arabel;
arabel=new Customer();
Customer otherCustomer2=new EnhanceCustomer();
}
- Customer arabel 声明一个Customer引用arabel,在栈上给一个引用分配存储空间,但这仅仅是一个引用,而不是实际的Customer对象
- arabel=new Customer() 分配堆上的内存,一存储Customer对象(一个真正的对象,不仅是地址)。而后把arabel的值设置为分配给新Customer对象的内存地址
- 总结:new方法其实就是栈+堆来储存的。栈上记录引用,堆上记录对象自己。
- 注意:与栈不一样,堆的内存是向上分配的,因此空闲空间在已用空间的上方
垃圾回收
web
注意:能够调用System.GC.Collect()方法,强迫垃圾回收器在代码的某一个地方运行。数据库
成员 | 说明 |
---|---|
Batch | 禁用并发设置,把垃圾回收设置为最大吞吐量。这会重写配置设置 |
Interactive | 工做站的默认设置。它使用垃圾回收并发设置,平衡吞吐量和响应 |
LowLatency | 保守的垃圾回收。只有在系统存在内存压力时,才能进行完整的回收。只应用于较短期,执行特定的操做。 |
SustainedLowLatency | 只有在系统存在内存压力时,才能进行完整的内存块回收 |
NoGCRegion | 成功调用TryStartGCRegion后,指定不该运行的垃圾回收器,直到调用EndNoRegion为止。 |
强引用和弱引用
安全
若是对象相互引用,但没有在根表中引用,例如:对象A引用B,B引用C,C引用A,则GC能够销毁这些全部的对象网络
var myWeakPeference =new WeakReference(new DataObject());
if(myWeakPeference.IsAlive)
{
DataObject strongReference =myWeakPeference.Target as DataObject;
if(strongReference!=NULL)
{
//使用强引用
}
else
{
//不可音乐
}
}
处理非托管的资源架构
protected override void Finalize()
{
try
{
//FInalizer implements
}
finally
{
base.Finalize();
}
}
ResourceGobbler theInstance=null;
try
{
theInstance = new ResourceGobbler();
}
finally
{
theInstance.Dispose;
}
using (var theInstance = new ResourceGobbler())
{
//do your processing
}
using 语句的后面是一对圆括号,其中是引用变量的声明和实例化,该语句使变量的做用域限定在随后的语句块中。另外,在变量超出做用域时,即便出现异常,也会自动调用其Dispose()方法并发
若是建立了终结器,就应该实现IDisposable接口。下面是一个双重实现的例子(正确调用Dispose(),同时把实现析构函数做为一种安全机制)ide
using System;
public class ResourceHolder : IDisposable
{
private bool _isDisposed=false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!_isDisposed)
{
if(disposing)
{
//Cleanup managed objects by calling their
//Dispose() Methods
}
Cleanup unmanaged objects
}
_isDisposed=true;
}
~ResourceHolder()
{
Dispose(false);
}
public void someMethod()
{
//Ensure object not already disposed before excution of any method
if(_isDisposed)
{
throw new ObjectDisposedException("ResourceHolder");
}
//method implementation
}
}
用指针直接访问内存svg
unsafe int GetSomeNumber()
{
//code that can use pointers
}
unsafe :能够标记在类、成员、方法中函数
指针的语法(略)
int *pointerToInt;
void *pointerToVoid;
pointerToVoid=(void)pointerToInt;
结构指针:指针成员访问运算符
struct MyStruct
{
public long X;
public float F;
}
MyStruct *PMystruct;
var mystruct =new MyStruct();
PMystruct=&mystruct;
(*PMystruct).X;
PMystruct->Y;
类成员指针
class MyClass
{
public long X;
public float F;
}
var myObject = new MyClass();
fixed(long* pX =&(myObject.X))
fixed(float* pF=&(myObject.F))
{
//do something
}
使用指针优化性能