抛出或遇到异常时:
void ThrowException()
{
try
{
throw new Exception("Error");
}
catch
{
}
}
是&它是如何从记忆中消失的?
以上代码与Exception对象的内存处理有何不同以下代码?
void ThrowException()
{
try
{
throw new Exception("Error");
}
catch(Exception e)
{
}
}
答案 0 :(得分:7)
异常不会从IDisposable继承,因此不需要处理它。 内存释放由GC完成,就像所有.NET对象一样。
答案 1 :(得分:2)
Exception实例只是作为内存中的另一个对象 - 在catch方法之后,没有对该实例的任何剩余引用,因此它将在下一次垃圾收集扫描中被删除。
异常通常不会从IDisposable继承,因为实际上不应该有与Exception关联的外部资源。如果你做。有一个IDisposable例外,你应该看看你的架构和&代码设计是正确的。
答案 2 :(得分:2)
简答。不要担心,垃圾收集器会这样做。
答案很长。 “忘掉”你所知道的有关内存管理的所有内容,并阅读Top 20 . net garbage collection articles
答案 3 :(得分:1)
当不再有任何对它的引用时,Exception类将被垃圾收集,垃圾收集器最终会转向。异常对象的处理方式与堆上分配的任何其他对象一样。
由于异常对象向上冒泡,当不再有方法捕获或将其抛到堆栈上方时,它将不再具有对它的引用。
两个示例都会产生相同的影响,因为它们都没有将异常提高,当方法返回时它将不再引用。
答案 4 :(得分:1)
由于异常没有实现IDisposable
,因此垃圾收集器会像其他任何对象一样自动删除它们,因为它们不再被引用,因此您不必关心它们。只需实现一个示例类:
class CustomException : Exception {
~CustomException() {
Console.WriteLine("Exception removed");
}
}
class Program {
static void Throw() {
throw new CustomException();
}
static void Main(string[] args) {
try {
Throw();
}
catch {
}
}
}