【附详细示例代码】关于对象实现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
}
}
[解决办法]
不用的,不是所有基类都要写释放的方法,系统有自动释放的功能