Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 如果从未调用终结器,将对终结器造成性能损失_C#_.net_Garbage Collection_Finalizer - Fatal编程技术网

C# 如果从未调用终结器,将对终结器造成性能损失

C# 如果从未调用终结器,将对终结器造成性能损失,c#,.net,garbage-collection,finalizer,C#,.net,Garbage Collection,Finalizer,我有一个带有终结器的类。但是,由于我总是调用Dispose(),而Dispose()则调用GC.supersfinalize(this),因此我认为我的对象实际上从未进入最终确定队列。终结器就在那里作为一个后盾,以防类的另一个用户忘记调用Dispose() 即使从未调用终结器且对象从未到达终结队列,仅实现终结器是否会造成性能损失 我以前不这么认为,但在Bill Wagner的《有效C#:第二版》第102页上,它说,“即使它从未被调用过,终结器的出现也会给你的类型带来相当大的性能损失。” 即使从未

我有一个带有终结器的类。但是,由于我总是调用
Dispose()
,而
Dispose()
则调用
GC.supersfinalize(this)
,因此我认为我的对象实际上从未进入最终确定队列。终结器就在那里作为一个后盾,以防类的另一个用户忘记调用
Dispose()

即使从未调用终结器且对象从未到达终结队列,仅实现终结器是否会造成性能损失

我以前不这么认为,但在Bill Wagner的《有效C#:第二版》第102页上,它说,“即使它从未被调用过,终结器的出现也会给你的类型带来相当大的性能损失。”

即使从未调用终结器且对象从未到达终结队列,仅实现终结器是否会造成性能损失

只要您正确地实现了这一点,并且对对象调用了
GC.SuppressFinalize
,那么“惩罚”只会在用户不调用
Dispose()
时发生


尽管如此,“严厉”的惩罚在大多数情况下实际上并不那么严厉。如果有许多带有终结器的短期对象污染了垃圾收集过程,这将是一个问题,但这很少是一个问题,因为带有终结器的对象很少(总体而言)。

IIRC,带有终结器的对象存在一个额外的gc周期。但是,这仅在调用终结器时适用。本文对此做了很好的解释:

即使带有终结器的对象很少见,根据所持有的引用,您也可能无法GC很多对象。。。