![](/img/trans.png)
[英]Do I need to use “using” keyword in every object which implements IDisposable?
[英]Do I need to use IDisposable?
尝试查看我是否正确理解了这一点。 遗憾的是,我没有使用IDisposable的丰富经验。 我们正在使用静态类,并使它成为非静态类,并且该类负责在Xamarin应用中进行Web服务调用。 我绝对不希望这是一个对象。 因此,我想到让此类继承IDisposable接口,并实现了如下所示的方法:
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: dispose managed state (managed objects).
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
disposedValue = true;
}
}
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
//~WebServiceCallThread()
//{
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
// Dispose(false);
//}
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
// TODO: uncomment the following line if the finalizer is overridden above.
//GC.SuppressFinalize(this);
}
因此,所有这些似乎都在做,就是在调用Dispose
方法时,它随后调用在Dispose(bool disposing)
上方声明的虚拟方法。 对于当前的代码,这什么也没做(看起来如此)。 它只是调用Dispose
方法,其中调用了重载的Dispose
方法。 但实际上,这里没有任何东西可以“处置”。
经过一些研究,它看起来很像(这就是为什么我要问的原因,我认为我理解正确)。 它说,如果您dispose managed state
,则仅调用finalizer
和GC.SuppressFinalize
方法。 我不确定dispose manage state
含义是什么,但是在我的课上确实没有什么需要配置的。 我只是有一些全局int变量,仅此而已。 此类的核心是HttpCall,它已经自动处理对象,例如:
public async void CallUrlHttpClient(string URL, System.Action<string> Handler, System.Action<XamarinMobile.Classes.ErrorInfo> ErrorHandler, int Tries)
{
var result = string.Empty;
didMakeSuccessfulHttpRequest = false;
using (var client = new HttpClient())
{
... Code
}
...
所以这是我的问题:我是否需要使此类继承IDisposable
? 我想知道是否在做任何事情,但似乎我的应用程序可以利用GC摆脱使用此类的对象。 这就是我通过类中的静态方法调用它的方式:
public static void WebServiceCall(string URL, System.Action<string> Callback)
{
//using (XamarinMobile.Classes.WebServiceCallThread thread = new Classes.WebServiceCallThread())
//{
XamarinMobile.Classes.WebServiceCallThread thread = new Classes.WebServiceCallThread();
thread.Call(URL, Callback);
//}
}
如果我正确理解GC,则一旦完成此方法,GC就会自动摆脱该对象。 那么,我真的需要使WebServiceCallThread
继承自IDisposable吗? 我再次问我是否正确理解了所有这些。 如果没有,请纠正我,让我知道我感到困惑的地方。
谢谢。
如果您的类创建了HttpClient
并在其整个生命周期中都维护了该实例(例如实例变量),则将实现IDisposable
,而Dispose()
方法将处理HttpClient
。
那就是这一部分:
if (disposing)
{
// TODO: dispose managed state (managed objects).
_httpClient.Dispose();
}
在这种情况下,您不需要实现IDisposable
因为您已经在处理HttpClient
。
using (var client = new HttpClient())
{
... Code
}
但是, 实际上建议每个端点创建一个HttpClient
实例HttpClient
用它,而不是一遍又一遍地创建和处理。 (如果您的负载不是那么重,那么创建和处理HttpClient
可能不会造成任何不良影响。)
如果要避免创建和处理HttpClient
则可以实现IDisposable
。 您的类创建或接收HttpClient
实例(在其构造函数中)。 现在,您的类“拥有”了在处置您的类时需要处置的那个实例,您就可以使您的类IDisposable
。 这样,其他人知道您的班级需要处置。 他们可能不知道为什么,但这并不重要。 通过使其成为IDisposable
您可以让他们知道他们需要处理它。 然后,当您的类被处置时,它将清理其HttpClient
。
只是提供一些额外的说明:
许多人被问到“ IDisposable
用途是什么?” 会回答这会导致垃圾收集。 实际上,它与垃圾回收无关。 无论对象是否实现IDisposable
,它们总是在超出范围时(不再有对其的引用)被垃圾回收。
之所以会出现混乱,是因为IDisposable
的推荐模式(您所引用的模式)包括一个终结器( ~WebServiceCallThread()
),该终结器在对象被垃圾回收时被调用。
当垃圾收集器删除一项时,如果有一项,它将调用终结器。 如果尚未调用终结器,则此模式将使终结器调用Dispose()
,以防万一有人不按预期调用Dispose()
情况下进行备份。 但这不能替代调用Dispose()
因为没有告诉垃圾收集器何时收集该项目。 终结者有可能永远不会被调用。 它只是试图减轻如果消费者不调用Dispose()
会发生的情况的备份。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.