如何在实现 IDisposable 接口的 class 中处理具有局部变量的对象
How to dispose objects with local variables within a class that implements IDisposable Interface
public class AnswerModel: IDisposable
{
private bool disposedValue;
public string Answer { get; set; }
public string CodeSnippet { get; set; }
public string AnswerBy { get; set; }
public DateTime DatePosted { get; set; }
public string TimeStatus { get; set; }
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: dispose managed state (managed objects)
}
// TODO: free unmanaged resources (unmanaged objects) and override finalizer
// TODO: set large fields to null
disposedValue = true;
}
}
// // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources
~AnswerModel()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: false);
}
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
using (AnswerModel a = new AnswerModel())
{
a.Answer = answer.Answered;
a.AnswerBy = answer.AnswerBy;
a.DatePosted = answer.DatePosted;
a.CodeSnippet = answer.CodeSnippet;
answerModel.Add(a);
}
如何处理 AnswerModel 实例中的变量?
它会自己发生吗?
C# 是一种内存管理语言。当没有对对象的引用并且发生 GC 循环(GC = 垃圾收集器)时,在堆上创建的对象将被自动垃圾收集。
然而,有些对象使用托管内存之外的资源,例如文件流、Web 连接或数据库连接。他们实现了一个名为 IDisposable
的接口和一个名为 Dispose()
的函数,您可以在使用完资源后调用该函数。
此外 ~Object()
Finalizers
不是好的做法,因为您不知道 GC 何时释放对象,并且它会产生您无法控制的负载。
总而言之,当您的对象使用需要 Disposed
的外部资源时,您应该实施 IDisposable
,这样您就可以在不再需要它们时释放资源。
public class AnswerModel
{
private bool disposedValue;
public string Answer { get; set; }
public string CodeSnippet { get; set; }
public string AnswerBy { get; set; }
public DateTime DatePosted { get; set; }
public string TimeStatus { get; set; }
}
......somewhere within a function call.
AnswerModel a = new AnswerModel()
a.Answer = answer.Answered;
a.AnswerBy = answer.AnswerBy;
a.DatePosted = answer.DatePosted;
a.CodeSnippet = answer.CodeSnippet;
answerModel.Add(a);
这个实例是否会在没有任何终结器的情况下被垃圾回收?
public class AnswerModel: IDisposable
{
private bool disposedValue;
public string Answer { get; set; }
public string CodeSnippet { get; set; }
public string AnswerBy { get; set; }
public DateTime DatePosted { get; set; }
public string TimeStatus { get; set; }
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: dispose managed state (managed objects)
}
// TODO: free unmanaged resources (unmanaged objects) and override finalizer
// TODO: set large fields to null
disposedValue = true;
}
}
// // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources
~AnswerModel()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: false);
}
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
using (AnswerModel a = new AnswerModel())
{
a.Answer = answer.Answered;
a.AnswerBy = answer.AnswerBy;
a.DatePosted = answer.DatePosted;
a.CodeSnippet = answer.CodeSnippet;
answerModel.Add(a);
}
如何处理 AnswerModel 实例中的变量?
它会自己发生吗?
C# 是一种内存管理语言。当没有对对象的引用并且发生 GC 循环(GC = 垃圾收集器)时,在堆上创建的对象将被自动垃圾收集。
然而,有些对象使用托管内存之外的资源,例如文件流、Web 连接或数据库连接。他们实现了一个名为 IDisposable
的接口和一个名为 Dispose()
的函数,您可以在使用完资源后调用该函数。
此外 ~Object()
Finalizers
不是好的做法,因为您不知道 GC 何时释放对象,并且它会产生您无法控制的负载。
总而言之,当您的对象使用需要 Disposed
的外部资源时,您应该实施 IDisposable
,这样您就可以在不再需要它们时释放资源。
public class AnswerModel
{
private bool disposedValue;
public string Answer { get; set; }
public string CodeSnippet { get; set; }
public string AnswerBy { get; set; }
public DateTime DatePosted { get; set; }
public string TimeStatus { get; set; }
}
......somewhere within a function call.
AnswerModel a = new AnswerModel()
a.Answer = answer.Answered;
a.AnswerBy = answer.AnswerBy;
a.DatePosted = answer.DatePosted;
a.CodeSnippet = answer.CodeSnippet;
answerModel.Add(a);
这个实例是否会在没有任何终结器的情况下被垃圾回收?