在c#中从函数返回一个字符串时,内存是否被释放?

uin*_*inc 1 .net c# clr

这就是我的意思:

class mycalss
{
   string myfunc()
   {
      string str="hello";
      return str;
   }
}
...
static void main()
{
   string str2;
   str2=myfunc();
   ...
   ...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,垃圾收集器是否有可能删除str2的内容,因为str超出了范围?

Ros*_*ant 15

不会.垃圾检测器会看到str2有一个对数据的引用,它不会被收集.


Jon*_*eet 7

不,这里没有风险.将返回引用,如果垃圾收集器运行,它将能够看到引用main,因此它不会释放字符串.

需要注意的是,即使该字符串符合垃圾收集,它不会被立即释放-只有当垃圾收集器下次运行(甚至更晚,这取决于哪一代它结束了).

请注意,即使存在仍在范围内的变量,垃圾收集器也可以收集不再使用的对象 - 只要它知道该变量将不再被读取:

object x = new object();
Console.WriteLine(x);
// Lots more code not touching x
// The object could be collected at any time here
Run Code Online (Sandbox Code Playgroud)


MSa*_*ers 7

str和str2都是对一个(字符串)对象的引用.垃圾收集器将仅回收剩余引用为零的对象.