这就是我的意思:
class mycalss
{
string myfunc()
{
string str="hello";
return str;
}
}
...
static void main()
{
string str2;
str2=myfunc();
...
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,垃圾收集器是否有可能删除str2的内容,因为str超出了范围?
不,这里没有风险.将返回引用,如果垃圾收集器运行,它将能够看到引用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)