IDisposable - 在没有外部引用的情况下在课堂上处理什么?

Ale*_*der 2 c# dispose

我有小帮手班.这些类在内部用于确保某些类型的字符串始终具有适当的格式(邮件地址,电话号码,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整个代码中添加调用?

InB*_*een 6

不要这样做,你滥用语言和Disposable界面/模式.

IDisposable 有非常具体的原因,其中包括非托管资源的确定性释放,或者当您的班级拥有一次性参考资料时.

绝对不是创建本地范围的方法,因此您可以重用变量名称.如果您需要这样做,只需:

{
    Id id = ids.First())
    Container container = containers.getById(id);
    ...
}
Run Code Online (Sandbox Code Playgroud)


Sef*_*efe 5

编译器强制您IDiposableId类中实现接口,因为您使用它using.唯一的目的usingIDisposable.Dispose在你离开后阻止他们打电话.所以你只能在IDisposable实现上使用它.

这个目的是在IDisposable不再使用对象时清理外部资源.这包括关闭文件,断开数据库连接,返回窗口句柄等等.

由于您似乎没有办法清理,因此您无需使用该using语句.在必须使用的情况下using(例如,您对一些具有外部资源的不同类型的对象使用一种方法),您仍然必须实现该Dispose方法以满足该接口,但您可以将其保留为空.

如果你的课程是一次性的,你确实应该在你不再需要的时候处理它,即使Dispose什么都不做.如果您或其他人Dispose稍后添加清理代码,您应该依赖它执行.