这些变量是垃圾吗?

我今天正在练习编码,并且今天解决了“从链表中删除某个值的所有元素”的问题。 我提出的解决方案是

public void RemoveAll ( T val ) 
{
    if(_root == null)
       return;

    if(_root.Value == val)
    {
       _root = _root.Next;
       RemoveAll(val);
    }    

    Node last = _root, 
          cur = _root.Next;  
    while(cur != null)
    {
       if(cur.Value == val)
           last.Next = cur.Next;
       else
           last = cur;
       cur = cur.Next;
    }
}

这是我的问题:

cur.Value == val我正在做一些类似于更改列表的操作

A -> B -> C

A -> C

编译器或运行时环境是否会看到B不再被使用并处理掉? 或者我应该明确这么做吗?

我还有第二个问题,就是调用堆栈是否为递归void方法而爆发。 正如你在这里看到的那样,这个方法有可能调用它自己。 但是由于这是一种不返回值的方法,运行时环境不能擦除上次调用的数据吗? 没有理由留在记忆中(对吗?)。


编译器或运行时环境是否会看到B不再被使用并处理掉? 或者我应该明确这么做吗?

GC在运行时会意识到没有对该对象的主动引用并将其清除(假设没有其他人持有对该对象的引用)。 您无法手动清理.NET中的单个对象。 在.NET中,内存由垃圾收集器根据需要进行管理和清理。

我还有第二个问题,就是调用堆栈是否为递归void方法而爆发。 正如你在这里看到的那样,这个方法有可能调用它自己。 但是由于这是一种不返回值的方法,运行时环境不能擦除上次调用的数据吗? 没有理由留在记忆中(对吗?)。

你正在描述尾递归。 C#编译器不会生成尾递归调用。 Becaus eof说,如果你的递归太深,你可能会遇到StackOverflowException

该限制不是CLR限制 - .NET Framework确实支持尾部调用。 它是不会发出尾部IL操作码的C#编译器。 在手动生成IL或使用F#时,您可以在.NET Framework中使用尾递归工作,这会在适当的时候生成尾调用。

有关更多详细信息,请参阅https://stackoverflow.com/a/15865150/1163867。

PS。 我认为你的代码有一个错误。 看起来您应该在递归调用RemoveAll后尽早返回:

if(_root.Value == val)
{
   _root = _root.Next;
   RemoveAll(val);
   return;
}    
链接地址: http://www.djcxy.com/p/80625.html

上一篇: Will these variables be garbage

下一篇: Looping code or recursive method calling?