私はこの問題に頭を悩ませようとしています。以下のコードは、最終的には、SubscribersClass 型のガベージ コレクション オブジェクトの数をカウントするだけです。コードが示されているように実行されると、SubscribersClass.Count の値が 0 になります。EventsClass の最初の行をコメント アウトし、そのクラスの残りのコメントを解除すると、SubscribersClass.Count の値は 10 になります。
私が思いつく唯一のことは、EventsClass EventHandler に問題があるため (示されているように)、SubscribersClass のインスタンスが実際に作成されていないということです。
誰かが何が起こっているのかを正確に理解するのを手伝ってくれることを望んでいました.
これは学術的なものであり、実用的な価値はありません。それを理解するために結ぶだけですが、これまでのところGoogleBlistersを取得することしかできませんでした.
namespace understandingEvents
{
public class EventsClass
{
public event EventHandler SomeEvent; // if this is commented out and
// remainder of class is uncommented
// it works fine
/*
public event EventHandler SomeEvent
{
add
{
Console.WriteLine("An event has been added");
}
remove
{
Console.WriteLine("An event has been removed");
}
}
*/
}
public class SubscribersClass
{
static int count = 0;
static public int Count
{
get { return count; }
}
public SubscribersClass (EventsClass eventPublisher)
{
eventPublisher.SomeEvent += new EventHandler(Subscriber_SomeEvent);
}
~SubscribersClass()
{
Interlocked.Increment(ref count);
}
public void Subscriber_SomeEvent(object sender, EventArgs e)
{
Console.WriteLine("This is an event");
}
}
class Program
{
static void Main(string[] args)
{
EventsClass publisher = new EventsClass();
for (int i = 0; i < 10; i++)
{
SubscribersClass subscriber = new SubscribersClass(publisher);
subscriber = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(SubscribersClass.Count.ToString());
}
}
}