gpt4 book ai didi

C# 析构函数 : the dispose "pattern" and best practises

转载 作者:行者123 更新时间:2023-11-30 18:48:25 26 4
gpt4 key购买 nike

我知道 C# 中析构函数和终结函数在含义和使用上的区别。

但是,通常“我应该...”的答案是“不要使用析构函数,而是使用 MSDN 中所示的处置模式”。埃里克·利珀特 writes相当strongly反对不必要地使用析构函数。

但是,该“模式”提倡编写这样的析构函数 ~T() { Dispose(false); }。陈述的原因是它是一个“回退”,在程序员忘记调用 Dispose() 时调用。当然,这忽略了一个事实,即终结器在其操作中是不确定的,甚至可能永远不会运行。

因此:

  1. 如果我使用处置模式,是否还应该提供析构函数?顺便说一下,我只处理托管资源(例如 Entity Framework DataContext)。

  2. 如果我确实提供了一个析构函数:如果我的类派生自 IDisposable,它可能已经提供了一个析构函数,那么我是否也应该提供一个?我认为在这种情况下永远不会编写析构函数,但是文档说无论如何它都会自动调用基类的析构函数。

最佳答案

我不会真的回答你的两个问题,但我会提供一个意见:

The stated reason is that it is a "fallback" which is called in case the programmer forgets to call Dispose().

如果方法的调用者传递一个要求,比方说,一个非空字符串,那么如果它们传递 null,您完全有权抛出异常,对吗?来电者违约;那是异常行为,因此您抛出异常。你不认为,哦,调用者“忘记”传递一个有效的参数,我想我会接受错误的输入并继续前进。这样做实际上是将方法的约定从“null 是 Not Acceptable 并且会产生异常”更改为“null 是可接受的并且被视为空字符串”,例如。

如果用户在完成时调用 Dispose 是一个要求,而他们没有调用,那么这与调用方在调用方法时未能履行约定没有什么不同。调用者未能满足要求,因此使他们的程序崩溃。如果析构函数遇到未处置的对象,则让析构函数抛出信息性异常。正如调用者很快就会知道将错误的参数传递给方法会造成伤害一样,他们也会了解到未能处置您的对象也会造成伤害。

要么显式处理对象是必要的,要么不是。如果有必要,请确保用户这样做。否则就是隐藏他们的错误

关于C# 析构函数 : the dispose "pattern" and best practises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127937/

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