gpt4 book ai didi

c# - 为什么没有处置契约(Contract)?

转载 作者:太空宇宙 更新时间:2023-11-03 17:17:32 24 4
gpt4 key购买 nike

我们有构造函数,我们可以将它们视为对象实例化要遵循的契约。

没有其他方法可以在不向构造函数提供精确参数集的情况下创建实例。

但是我们如何(而且我们是否应该费心)强制执行一些验尸前事件?我们有终结器,但不建议将它们用于通用终结器。我们还有 IDisposable 来实现。但是,如果我们在不使用 using 的情况下使用一次性对象,我们无法保证会调用 Dispose。

为什么现在有办法在对象被释放之前强制其处于某种状态?

在终结器中整理是不可能的,因为不能保证对象图是完整的并且垂死对象的引用对象没有被 GC 清空。

当然,不通过客户端代码调用实例对象的 SaveState() 会给它带来一些麻烦,而不是我的对象。

尽管如此,要求在构造函数中注入(inject)所有需要的依赖项(如果没有可用的默认值)被认为是一种很好的做法。没有人会轻易地说:“保留默认构造函数,创建属性并在对象处于无效状态时抛出异常。”

更新:

由于有很多人投票赞成结束这个问题,我想说一些设计模式也可以作为答案。

无论您是否使用 DI,您都可以计算对象被请求/创建的次数。但是如果没有显式的 release 调用,你不知道什么时候应该调用 dispose。

我根本不明白如何在正确的时间实现处置。

最佳答案

Why is there no way to enforce some state of the object before it will be let go of?

因为垃圾收集器的全部意义在于 simulate a machine that has an infinite amount of memory 。如果内存是无限的,那么您永远不需要清理它。

您正在将程序的语义要求(即在特定时间发生特定副作用)与模拟无限存储的机制混为一谈。在理想的世界中,这两件事应该没有任何关系。不幸的是,我们并不生活在一个理想的世界中;终结器的存在就是证明。

如果您想在特定时间实现某些效果,那么这些效果是您程序的一部分,您应该编写实现它们的代码。如果它们很重要,那么它们应该在代码中可见,以便阅读代码的人可以看到并理解它们。

关于c# - 为什么没有处置契约(Contract)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16089144/

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