读书人

【附详细示例代码】关于对象实现IDisp

发布时间: 2012-02-10 21:27:42 作者: rapoo

【附详细示例代码】关于对象实现IDisposable接口,使用Dispose()方法释放资源的疑问
我很希望自己的程序实现IDisposable,这样可以使用using语句简化代码、优化程序,但是网上关于IDisposable接口实现的说明很杂,我只糊里糊涂的学来了一点,照猫画虎做出了这个示例代码,想在此请教各位,下面的代码中,释放资源的部分代码写的是否正确?我是否需要在Dispose()方法中自己手动逐个清理每个字段的值?还是说C#会自己完成这些工作?


namespace 学校
{

public class 学生 : IDisposable
{

#region 基础代码

/// <summary>
/// 构造函数
/// </summary>
public 学生()
{

}

/// <summary>
/// 对象唯一索引编号
/// 对应属性:编号
/// </summary>
int ID;

/// <summary>
/// [只读]
/// 对象唯一索引编号
/// 对应字段:ID
/// </summary>
public int 编号
{

get
{
return ID;
}

}

/// <summary>
/// 对应属性:姓名
/// </summary>
string Name;

/// <summary>
/// 对应字段:Name
/// </summary>
public string 姓名
{

get
{
return Name;
}

set
{
Name=value;
}

}

/// <summary>
/// 重写ToString方法
/// </summary>
public override string ToString()
{
StringBuilder S = new StringBuilder();
S.AppendLine( "[学生]对象 ");
S.AppendLine( "编号(ID:int): " + 编号);
S.AppendLine( "姓名(Name:string): " + 姓名);
return S.ToString();

}

#endregion

#region 扩展功能代码

#region IDisposable 成员

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

protected virtual void Dispose(bool disposing)
{
if (!hasDispose)
{


if (disposing)
{

}
hasDispose = true;
}
}

~学生()
{
Dispose(false);
}

private bool hasDispose;

#endregion

#endregion

}

/// <summary>
/// 对应数据表:[Teacher]
/// </summary>
public class 教师 : IDisposable
{

#region 基础代码

/// <summary>
/// 构造函数
/// </summary>
public 教师()
{

}

/// <summary>
/// 对象唯一索引编号
/// 对应属性:编号
/// </summary>
int ID;

/// <summary>
/// [只读]
/// 对象唯一索引编号
/// 对应字段:ID
/// </summary>
public int 编号
{

get
{
return ID;
}

}

/// <summary>
/// 对应属性:名称
/// </summary>
string Name;

/// <summary>
/// 对应字段:Name
/// </summary>
public string 名称
{

get
{
return Name;
}

set
{
Name=value;
}

}

/// <summary>
/// 重写ToString方法
/// </summary>
public override string ToString()
{
StringBuilder S = new StringBuilder();
S.AppendLine( "[教师]对象 ");
S.AppendLine( "编号(ID:int): " + 编号);


S.AppendLine( "名称(Name:string): " + 名称);
return S.ToString();

}

#endregion

#region 扩展功能代码

#region IDisposable 成员

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

protected virtual void Dispose(bool disposing)
{
if (!hasDispose)
{
if (disposing)
{

}
hasDispose = true;
}
}

~教师()
{
Dispose(false);
}

private bool hasDispose;

#endregion

#endregion

}

public class 班级 : IDisposable
{

#region 基础代码

/// <summary>
/// 构造函数
/// </summary>
public 班级()
{

}

/// <summary>
/// 对象唯一索引编号
/// 对应属性:编号
/// </summary>
int ID;

/// <summary>
/// [只读]
/// 对象唯一索引编号
/// 对应字段:ID
/// </summary>
public int 编号
{

get
{
return ID;
}

}

/// <summary>
/// 对应属性:班主任
/// </summary>
教师 Master;

/// <summary>
/// 对应字段:Master
/// </summary>
public 教师 班主任
{

get
{
return Master;
}

set
{
Master=value;
}



}

/// <summary>
/// 对应属性:学生
/// </summary>
List <学生> Students;

/// <summary>
/// 对应字段:Students
/// </summary>
public List <学生> 学生
{

get
{
return Students;
}

set
{
Students=value;
}

}

/// <summary>
/// 重写ToString方法
/// </summary>
public override string ToString()
{
StringBuilder S = new StringBuilder();
S.AppendLine( "[班级]对象 ");
S.AppendLine( "编号(ID:int): " + 编号);
S.AppendLine( "班主任(Master:教师): " + 班主任);
S.AppendLine( "学生(Students:List <学生> ): " + 学生);
return S.ToString();

}

#endregion

#region 扩展功能代码

#region IDisposable 成员

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

protected virtual void Dispose(bool disposing)
{
if (!hasDispose)
{
if (disposing)
{

}
hasDispose = true;
}
}

~班级()
{
Dispose(false);
}

private bool hasDispose;

#endregion

#endregion

}

}

[解决办法]
不用的,不是所有基类都要写释放的方法,系统有自动释放的功能

读书人网 >C#

热点推荐