这就是我的意思:
class mycalss { string myfunc() { string str="hello"; return str; } } ... static void main() { string str2; str2=myfunc(); ... ... }
在这种情况下,垃圾收集器是否有可能删除str2的内容,因为str超出了范围?
不会.垃圾检测器会看到str2有一个对数据的引用,它不会被收集.
不,这里没有风险.将返回引用,如果垃圾收集器运行,它将能够看到引用main
,因此它不会释放字符串.
需要注意的是,即使该字符串是符合垃圾收集,它不会被立即释放-只有当垃圾收集器下次运行(甚至更晚,这取决于哪一代它结束了).
请注意,即使存在仍在范围内的变量,垃圾收集器也可以收集不再使用的对象 - 只要它知道该变量将不再被读取:
object x = new object(); Console.WriteLine(x); // Lots more code not touching x // The object could be collected at any time here
str和str2都是对一个(字符串)对象的引用.垃圾收集器将仅回收剩余引用为零的对象.