考虑以下代码:
public class Class1
{
public static int c;
~Class1()
{
c++;
}
}
public class Class2
{
public static void Main()
{
{
var c1=new Class1();
//c1=null; // If this line is not commented out, at the Console.WriteLine call, it prints 1.
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(Class1.c); // prints 0
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,即使main方法中的变量c1超出范围并且在GC.Collect()
调用时没有被任何其他对象进一步引用,为什么它没有在那里完成?
看看这篇文章:在GC上更新的引用,似乎堆可以在垃圾收集上得到压缩,这意味着引用会改变.
现在,如果我将一个对象放在一个Dictionary中作为一个键(假设该对象没有实现GetHashCode/Equals),那么该引用将用于确定它在其内部哈希表中的位置.随后在GC上,如果引用发生了变化,我想查找对象C#将如何找到它?