Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承IDisposable时,如果没有要处理的内容,该怎么办?_C#_.net_Idisposable - Fatal编程技术网

C# 继承IDisposable时,如果没有要处理的内容,该怎么办?

C# 继承IDisposable时,如果没有要处理的内容,该怎么办?,c#,.net,idisposable,C#,.net,Idisposable,继承,我必须实现,即使我没有任何东西要处理。我还应该走过场吗 public sealed class NothingEnumerator<T> : IEnumerator<T> { private bool disposed; public object Current { get { if (disposed) throw new ObjectDisposedException("Noth

继承,我必须实现,即使我没有任何东西要处理。我还应该走过场吗

public sealed class NothingEnumerator<T> : IEnumerator<T>
{
    private bool disposed;

    public object Current
    {
        get
        {
            if (disposed) throw new ObjectDisposedException("NothingEnumerator");
            return default(T);
        }
    }

    public void Dispose()
    {
        disposed = true;
    }

    public bool MoveNext()
    {
        if (disposed) throw new ObjectDisposedException("NothingEnumerator");
        return false;
    }

    public void Reset()
    {
        if (disposed) throw new ObjectDisposedException("NothingEnumerator");
    }
}
公共密封类NothingUMerator:IEnumerator
{
私人住宅;
公共对象流
{
得到
{
如果(已处置)抛出新的ObjectDisposedException(“NothingUMerator”);
返回默认值(T);
}
}
公共空间处置()
{
这是真的;
}
公共图书馆
{
如果(已处置)抛出新的ObjectDisposedException(“NothingUMerator”);
返回false;
}
公共无效重置()
{
如果(已处置)抛出新的ObjectDisposedException(“NothingUMerator”);
}
}
还是不

public sealed class NothingEnumerator<T> : IEnumerator<T>
{
    public object Current
    {
        get { return default(T); }
    }

    public void Dispose()
    {
    }

    public bool MoveNext()
    {
        return false;
    }

    public void Reset()
    {
    }
}
公共密封类NothingUMerator:IEnumerator
{
公共对象流
{
获取{返回默认值(T);}
}
公共空间处置()
{
}
公共图书馆
{
返回false;
}
公共无效重置()
{
}
}

换句话说,“disposed”对象是否必须抛出?

只有当调用方试图执行由于对象已被释放而无法执行的操作时,才应该抛出异常。如果他们试图执行的操作即使在处理对象之后也能正常工作,那么没有理由抛出

当然,如果你想扔,当然欢迎你。这是您在一天结束时的决定,但是,与方法/属性依赖于不再存在的资源的情况不同,不再有任何理由强迫您抛出

如果没有要处理的其他资源,请提供空的
dispose
实现


在“实施者笔记”中还有其他建议,我也会考虑。(使非泛型属性/方法显式实现等)

一旦对象被释放,它关于可用的任何承诺都将无效,但这并不意味着该对象承诺不可用。如果对象由于被释放而无法执行请求的操作,它应该抛出
ObjectDisposedException
,而不是以其他方式失败,但是能够在不需要任何外部资源的情况下执行请求的对象可以自由地这样做


至于如何实现
IDisposable
,我建议您遵循
IDisposable
模式,并使用公共
Dispose
,如果您打算要求使用类型调用的所有代码
Dispose
,如果希望暗示不需要对类型的引用调用dispose,那么只需包含一个空的显式接口实现。如果声明为返回您的类型的工厂方法可能返回需要处理的派生类型的新构造实例(例如,
IEnumerable.GetEnumerator()
),则您的类型应设计为鼓励客户端代码调用
Dispose
,但除此之外,它可能是不必要的。

否-他们只需要在访问已处理对象异常时抛出。如果您不需要
IEnumerable
类型所提供的一切,也许您应该从其他类型继承,或者甚至考虑组合而不是继承。我还将显式地实现它,
IDisposable.Dispose()
那么它只能在强制转换为
IDisposable
@WillMarcouiller时被调用。您可能正在做的各种事情都会迫使您实现一个
IEnumerator
,因为有太多的事情使用这种类型的对象(或
IEnumerable
)。创建您自己的稍有不同的枚举器接口意味着失去使用与
IEnumerable
相关的所有库代码的能力。在这种情况下,您可能应该执行
列表中列出的操作。枚举器
所做的就是这样做。它甚至没有记录它是否被处理过。