考虑以下代码:
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()调用时没有被任何其他对象进一步引用,为什么它没有在那里完成?
一个简单的问题.假设我有一个如下例所示的类.
class Subscriber
{
private Publisher publisher = new Publisher;
public Subscriber()
{
publisher.SomeEvent += new EventHandler(OnEventFired);
}
private void OnEventFired(object sender, EventArgs e)
{
}
}
Run Code Online (Sandbox Code Playgroud)
在程序的某个地方,我有一个看起来像这样的方法:
public void DoSomething()
{
Subscriber subscriber = new Subscriber();
}
Run Code Online (Sandbox Code Playgroud)
我是否正确地期望这会导致内存泄漏,因为订阅者永远不会取消订阅发布者事件,从而导致他们都保持对彼此的强引用?