我有小帮手班.这些类在内部用于确保某些类型的字符串始终具有适当的格式(邮件地址,电话号码,ID,URL,键,颜色......).
我想将它们放入使用块中,以便能够回收变量名称:
using(Id id = ids.First())
{
Container container = containers.getById(id);
...
}
foreach(Id id in ids.Skip(1))
{
Container container = containers.getById(id);
...
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,Visual Studio要求我将这些类标记为Disposable
,我做了,但我不知道如何处理方法存根.我们以"邮件地址"类为例:
public class MailAddress : IEquatable<MailAddress>, IDisposable
{
const string MAILADDRESSPATTERN = ...
protected string _address;
public MailAddress(string address)
{
if (address == null) throw new ArgumentNullException("address");
if (!Regex.IsMatch(address, MAILADDRESSPATTERN)) throw new ArgumentException("address");
this._address = address.ToLower();
}
bool IEquatable<MailAddress>.Equals(MailAddress other)
...
public override int GetHashCode()
...
...
...
public override string ToString()
...
public void Dispose()
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
该Dispose
功能在这样的课程中究竟要做什么?我需要处理什么,以及垃圾收集器会自动执行什么操作?
到目前为止,我没有Dispose
在任何地方打电话,它似乎工作正常.现在,该类是Disposable
,我是否必须在Dispose
整个代码中添加调用?
不要这样做,你滥用语言和Disposable
界面/模式.
IDisposable
有非常具体的原因,其中包括非托管资源的确定性释放,或者当您的班级拥有一次性参考资料时.
绝对不是创建本地范围的方法,因此您可以重用变量名称.如果您需要这样做,只需:
{
Id id = ids.First())
Container container = containers.getById(id);
...
}
Run Code Online (Sandbox Code Playgroud)
编译器强制您IDiposable
在Id
类中实现接口,因为您使用它using
.唯一的目的using
是IDisposable.Dispose
在你离开后阻止他们打电话.所以你只能在IDisposable
实现上使用它.
这个目的是在IDisposable
不再使用对象时清理外部资源.这包括关闭文件,断开数据库连接,返回窗口句柄等等.
由于您似乎没有办法清理,因此您无需使用该using
语句.在必须使用的情况下using
(例如,您对一些具有外部资源的不同类型的对象使用一种方法),您仍然必须实现该Dispose
方法以满足该接口,但您可以将其保留为空.
如果你的课程是一次性的,你确实应该在你不再需要的时候处理它,即使Dispose
什么都不做.如果您或其他人Dispose
稍后添加清理代码,您应该依赖它执行.
归档时间: |
|
查看次数: |
384 次 |
最近记录: |