gpt4 book ai didi

c# - 对 IDisposable 使用不变量

转载 作者:太空狗 更新时间:2023-10-29 21:43:58 25 4
gpt4 key购买 nike

考虑以下 IDisposable 类:

class MyClass : IDisposable
{
public bool IsDisposed { get; private set; } = false;

public void Dispose()
{
IsDisposed = true;
}
}

这个类中的每个方法,包括 Dispose(),都应该以这样的检查开始:

if (IsDisposed)
{
throw new ObjectDisposedException(...);
}

因为在所有方法中都写这个很乏味和重复,所以我想使用契约不变量:

public class MyClass : IDisposable
{
...

[ContractInvariantMethod]
private void objectInvariant()
{
Contract.Invariant(!IsDisposed)
}

...
}

但是,这只能确保 IsDisposed 在每个公共(public)方法的末尾 为假,Dispose() 除外。

调用Dispose() 后,应在每个方法的开头(包括Dispose())进行检查。否则对象将在方法运行期间处于无效状态,可能导致困难的错误。

因此,契约不变量对于 IDisposable 并不是真正可用的。还是我遗漏了什么?

是否可以强制将不变量也用作前提条件,或者我真的必须手动为所有方法编写相同的前提条件 (!IsDisposed)?

最佳答案

您似乎误解了不变量。来自文档:

Object invariants are conditions that should be true for each instance of a class whenever that object is visible to a client.

(强调我的)在您调用 Dispose 后,您的对象很可能对客户端可见,从而使该对象“无效”。但它实际上是您的对象具有 IsDisposed == true 的有效状态。

您真的是在寻找先决条件。

关于c# - 对 IDisposable 使用不变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33086443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com