C# 使用后是否处理此变量?

C# 使用后是否处理此变量?,c#,.net,variables,clr,local,C#,.net,Variables,Clr,Local,我只是不知道某个方法中使用的变量在该方法执行完成后会消失在何处,请参见下面的代码片段: void Foo() { List<object> conditionedObjList; conditionedObjList = GetConditionedObjectList ( new List<object>() { /*there are many unconditioned

我只是不知道某个方法中使用的变量在该方法执行完成后会消失在何处,请参见下面的代码片段:

    void Foo()
    {
        List<object> conditionedObjList;
        conditionedObjList = GetConditionedObjectList
            (
            new List<object>() { /*there are many unconditioned objects here*/}
            );
    }

当您返回对它的引用时,它不会被释放

如果它只在函数本地使用,它就会超出范围。在这种情况下,在函数返回后,没有对它的引用,因此GC可以自由地收集它

顺便说一句,列表没有实现IDisposable,因此不需要在代码中处理它。

C#具有垃圾收集功能。对象是在堆上创建的,并且仅当对象没有更多引用时才收集对象

myObjList
只存储对堆上实际对象的引用;当您返回此引用并将其存储在变量中时,您可以保证垃圾收集器(GC)不会拾取它

如果“disposed”的意思是“destromed”或“removed from memory”,那么垃圾收集器会为您执行此操作;您只需删除对对象的引用。例如,您可以在调用函数后将
conditionedObjList
设置为
null
。然后GC可以自由地拾取未引用的对象。请注意,这不是立即的;GC只会定期运行以提高效率

  • 该列表没有实现IDisposable——因此我们根本不需要处理它
  • 一旦您没有任何引用,它将被标记为垃圾收集

  • 不清楚你想做什么
    getConditionObjectList
    完全忽略其传入参数。(也许这无关紧要,但它掩盖了您的问题。)当调用
    GetConditionedObjectList
    返回时,局部变量(在Foo中)
    conditionedObjectList
    将引用您在
    GetConditionedObjectList
    中创建的列表
    myObjectList
    。当Foo退出时,将不再有对列表的引用,它将被标记为垃圾收集。听起来你是在谈论垃圾收集,而不是对Joel进行处理(在.NET中有不同的含义):假设T是字符串,在方法“GetConditionedObjectList”中,我从传入参数originalObjList中进行一些选择,例如,枚举列表以检查originalObjList中的元素是否是以“foo”开头的字符串,然后将该元素添加到myObjList中。并返回myObjList。仅将引用存储在堆栈变量中并不能保证它不会被收集:@Curt:Hmm,有趣。我在文章中尝试了该示例,但无法在.NET3.5上重现该行为(调试和发布行为一致,直到方法结束后才收集对象,尽管在主要结束之前)。这也不太可能是偶然发生的行为。。。
        private List<object> GetConditionedObjectList(List<object> originalObjList)
        {
            List<object> myObjList = new List<object>();
            /*do some selection*/
            myObjList.AddRange(new object[]{/*there are 100 conditioned objects here*/});
            return myObjList;
        }