C#-抛出异常时释放内存,可能没有finally块

本文关键字:finally 抛出异常 释放 内存 C#- | 更新日期: 2023-09-27 18:19:26

在我的C#应用程序中,我在初始化一些非常大的数组时抛出自定义的异常。当抛出没有catch的Exceptions时,我如何释放应用程序使用的所有内存,直到抛出异常,所以没有finally block,只有throw语句?或者在这种情况下,finally块可以在抛出之后执行吗?

感谢

C#-抛出异常时释放内存,可能没有finally块

如果您有一个本地数组声明,那么您不需要关心它,因为它将由GC为您收集。所以,如果你的代码看起来像这样:

int[] values = new int[100000];
// Some initialization here
throw new ApplicationException();
// Some initialization here

那么你就不需要关心它了。这同样适用于这样的情况,如果你的数组变量在处理异常时或之后超出范围,那么它也将是GC’ed。如果你把它作为类中的一个字段变量,而它本身不会被GC(意味着会有来自其他地方的对它的引用)或静态字段或类似的字段,那么唯一的问题可能会发生。如果你想确保这将被清除,你可以这样做:

try
{   
   m_Values = new int[100000];
   // Some initialization here
   throw new ApplicationException();
   // Some initialization here
}
catch // use this part if array should be used if there is no exception
{
   m_Values = null;
   throw;
}
finally // use this part if you never need an array afterwards
{
  m_Values = null;
}

因此,如果您使用此模式,您可以确保不会有对数组的引用,并且在某个时刻它将被垃圾收集。您也可以强制GC收集它,但不建议这样做。

您可以使用不带catch的try/finally语句。在这种情况下,finally块将被执行,而不管是否抛出异常。

try{
    ...
    throw new Exception();
    ...
}
finally{
    //cleanup code
    ...
}