代码改变世界

.net程序员应该掌握的常用类库 (二)

2010-03-25 10:44  贤达  阅读(4009)  评论(2编辑  收藏  举报

.net程序员应该掌握的常用类库 (一)

转贴请注明:博客园http://www.cnblogs.com/and/archive/2010/03/25/1694692.html 

  GC类

        它可以通过编程使用一个静态的成员集合与垃圾回收器进行交互。 一般只有使用那托管代码是才需要用到System.GC类

     垃圾回收由以下步骤组成:

        1.  垃圾回收器搜索托管代码中引用的托管对象。

        2.  垃圾回收器尝试完成没有被引用的对象。

        3.  垃圾回收器释放没有被引用的对象并回收它们的内存。

Guid类

   表示全局唯一标识符 (GUID)。 这个类园子里讨论比较火热。

   大家可以看看以下面几篇文章

          关于GUID 

ICloneable 接口

   支持克隆,即用与现有实例相同的值创建类的新实例。

柚子实现接口:

public class userinfo : System.ICloneable
    {
        public userinfo(string userName, string password)
        {
            this.UserName = userName;
            this.Password = password;
        }
        public string UserName { get; set; }
        public string Password { get; set; }

        public override string ToString()
        {
            return string.Format("姓名:{0} 密码:{1}", this.UserName, this.Password);
        }
        public object Clone()
        {
            userinfo userinfo = new userinfo(this.UserName, this.Password);
            return userinfo;
        }
调用接口
 class Program
    {
        static void Main(string[] args)
        {
            userinfo us1 = new userinfo("小武", "123456789");
            userinfo us2 = us1;
            userinfo us3 = us1.Clone() as userinfo;

            us2.UserName = "小武的相等";
            us3.UserName = "小武的克隆";

            Console.WriteLine(us1.ToString());
            Console.WriteLine(us2.ToString());
            Console.WriteLine(us3.ToString());

            Console.Read();
        
        }
    }

 

Idisposable接口

      定义一种释放分配的资源的方法。

         1、 Finalize只释放非托管资源;

         2、 Dispose释放托管和非托管资源;

        3、 重复调用Finalize和Dispose是没有问题的;

        4、  GC.Collect();   强制对所有代进行即时垃圾回收。

        5、 Finalize和Dispose共享相同的资源释放策略,因此他们之间也是没有冲突的。

MSDN中关于这个接口的说明:

[ComVisible(true)]
public interface IDisposable{  
  // Methods    void Dispose();
}
1.[ComVisible(true)]:指示该托管类型对 COM 是可见的.
代码
//1.下面代码对Dispose方法做了封装,说明如何在使用托管和本机资源的类中实现 Dispose(bool) 的常规示例:
public class BaseResource : IDisposable
{
// 非托管资源
private IntPtr handle;
//托管资源
private Component Components;
// Dispose是否被调用
private bool disposed = false;

public BaseResource()
{
}

public void Dispose()
{
Dispose(
true);
GC.SuppressFinalize(
this);
}

protected virtual void Dispose(bool disposing)
{

if (!this.disposed)
{
if (disposing)
{
// 释放托管资源
Components.Dispose();
}
// 释放非托管资源,如果disposing为false,
// 只有托管资源被释放
CloseHandle(handle);
handle
= IntPtr.Zero;
// 注意这里不是线程安全的
}
disposed
= true;
}

// 析构函数只会在我们没有直接调用Dispose方法的时候调用
// 派生类中不用在次提供析构函数
~BaseResource()
{
Dispose(
false);
}

// 如果你已经调用了Dispose方法后在调用其他方法会抛出ObjectDisposedException
public void DoSomething()
{
if (this.disposed)
{
throw new ObjectDisposedException();
}
}
}


public class MyResourceWrapper : BaseResource
{
// 托管资源
private ManagedResource addedManaged;
// 非托管资源
private NativeResource addedNative;
private bool disposed = false;

public MyResourceWrapper()
{
}

protected override void Dispose(bool disposing)
{
if (!this.disposed)
{
try
{
if (disposing)
{
addedManaged.Dispose();
}

CloseHandle(addedNative);
this<;/span>.disposed = true;
}
finally
{
base.Dispose(disposing);
}
}
}
}