C# 从函数返回而不销毁对象

C# 从函数返回而不销毁对象,c#,garbage-collection,C#,Garbage Collection,我在C#2.0中有一个名为Foo()的函数,它返回布尔类型的值。我正在实例化函数中的一个对象,在返回布尔值之前,我不会销毁该对象。我想知道是否有必要在返回值之前销毁创建的对象 谢谢。否。除非所讨论的对象实现IDisposable,否则在这种情况下,将其包装在using(){}语句中。否,它不是。如果Foo方法创建值类型,则它们位于堆栈上,因此在堆栈展开时会被清理。如果创建引用类型,当方法退出时,对这些实例的引用将超出范围,因此实例将被垃圾收集。在C#中,所有对象都是自动垃圾收集的,基本上没有办法

我在C#2.0中有一个名为Foo()的函数,它返回布尔类型的值。我正在实例化函数中的一个对象,在返回布尔值之前,我不会销毁该对象。我想知道是否有必要在返回值之前销毁创建的对象


谢谢。

否。除非所讨论的对象实现IDisposable,否则在这种情况下,将其包装在using(){}语句中。

否,它不是。如果Foo方法创建值类型,则它们位于堆栈上,因此在堆栈展开时会被清理。如果创建引用类型,当方法退出时,对这些实例的引用将超出范围,因此实例将被垃圾收集。

在C#中,所有对象都是自动垃圾收集的,基本上没有办法显式取消分配对象,因此,您不需要手动销毁对象


如果您的对象拥有一个资源,您希望确保释放该资源,但不需要(不能)销毁该对象。

对于i/o或db对象,最好使用dispose方法。否则,当您尝试修改先前引用但未发布的文件时,可能会发生异常


您还可以为对象指定null以删除引用。

查看所有正确答案和0个投票。为什么这么吝啬?您应该始终实现IDisposable,同时考虑这两种可能性:用户将显式(或在使用块中隐式)处理对象,而用户不会处理对象。在以后的情况下,您应该实现一个析构函数,该析构函数最终执行所需的任何清理。@dribeas-您的规则是反向的。如果对象具有析构函数,则它还必须实现IDisposable。但是如果一个对象实现了IDisposable,那么很少需要给它一个析构函数。e、 编译器创建迭代器类来支持IDisposable,但是它们没有析构函数,一个只包含对其他IDisposable的引用的类应该支持IDisposable,但它本身不需要析构函数。现在几乎没有必要用C#编写析构函数。SafeHandle是处理操作系统资源的更好工具。虽然通常不需要显式销毁由Foo创建的对象,但它们不会在堆栈上分配!在大多数托管语言中,有一个退化堆栈用于跟踪函数调用,所有对象都分配在托管堆上。@Tal:你读过我的答案了吗?!第一句是“不,它不是”就像“不,它没有必要破坏任何东西”。本地值类型位于堆栈上。对象或引用类型(如果您愿意的话)总是在堆上分配。@Tal:Java在版本6中获得escape analysis之前没有在堆栈上分配,但是.NET通过默认值分配堆栈上的所有值类型。我不想自相矛盾,但不,不,它没有。请看我最近的两篇关于这个主题的博客文章。@eric lippert:你能澄清一下你的评论是针对我还是针对viraptor的吗。我假设它是针对viraptor的,因为作为引用类型一部分的值类型将与对象的其余部分一起进入堆。这是你的观点吗?