内存机制,C#的数据类型以及内存管理机制剖析(2)

1. Object类再分析:
System.Object是所有.Net类的基类,包括值类型和引用类型。值类型为什么也是继承于System.Object的呢?Object不是引用类型吗?这个就涉及了.Net的一个有趣而神奇的机制--装箱和拆箱(box&un-box)。这个后面会提到。
Object是所有类(class)和结构(struct)的基类。Class都是继承于Object类的,struct都是继承于System.ValueType的,而System.ValueType是继承Object。
好了,既然Object类级别这么高,那么它应该包含哪些成员呢?当然是不会有成员变量了。这东西不可以在那么高级的类里存在的,而且也没有必要。不过Object类定义了很多通用的方法,如果你新建的类没有重载这些方法,那你的新建类就会自动继承Object类的这些方法。我把这些通用方法列于下表,以便大家参考:
方法名 前缀修饰符 作用  
string ToString() public virtual 返回对象的字符串表示  
int GetHashTable() public virtual 在实现字典(散列表)时使用 这是在集合(散列表中)使用的对象
bool Equals(object obj) public virtual 对对象的实例进行相等比较  
bool Equals(object obj1, object obj2) public static 对对象的实例进行相等比较  
bool ReferenceEquals(object obj1, object obj2) public static 比较两个引用是否指向同一个对象  
Type GetType() public 返回对象类型的详细信息  
object MemberwiseClone() protected 进行对象的浅表复制  
void Finalize() protected virtual 析构函数  
在上面我们看到了一些像virtual,static,protected这样的修饰符,我在学习C#语言机制的时候曾经对这些内容做了些详细的整理,会在以后的文章中发表。
我们看virtual修饰符,这说明某些方法是能够被重载的。比如说ToString()这样的方法。我们自己所定义的类不特别声明的话,都会继承Object。也就是说Object的这些公用方法存在于每一个类中,无论是.Net Framework中的类还是自定义的类。
2. 垃圾回收机制,dispose() & Finalize()
CriticalResource Instance = null; try { Instance = new CriticalResource; //processing code } finally { if(Instance != null) Instance.Dispose(); } //也可以用下面的方式,使用using块,可以减少代码量,起到同样效果 using(CriticalResource Instance = new CriticalResource) { //processing }
(3)Finalize和Dispose的双重实现 可以将Dispose()作为结束对象的方法,Finalize做为安全机制(没有调用Dispose是作为保险的方式)。这个方式应该是最佳释放资源解决方案,不过比较复杂些,可以参考下面的简单实现。
public class CResource : IDisposable { //记录是否已经执行Dispose Private bool isDispose = false; //实现Dispose方法 Public void Dispose() { //释放资源 Dispose(true); //GC禁止使用finalize析构函数 GC.SuppressDinalize(this); } protected virtual void Dispose(bool disp) { //没有执行过Dispose if(!isDisposed) { if(disp) { //释放托管资源 } //释放非托管资源 } isDisposed = true; } ~CResource() { Dispose(false) } public TestMethod() { //确保执行时资源未释放 if(isDisposed) { throw new Exception(); } } }
Tags:  虚拟内存管理机制 安卓内存调用机制 内存机制

延伸阅读

最新评论

发表评论