我一直與靜態事件擺弄周圍和好奇的一些東西..C# - 事件訂閱和可變覆蓋
這是我使用的基本代碼,並改變了這些問題。
class Program
{
static void Main()
{
aa.collection col = null;
col = new aa.collection(new [] { "a", "a"});
aa.evGatherstringa += col.gatherstring;
Console.WriteLine(aa.gatherstring());
// Used in question 1
aa.evGatherstringa -= col.gatherstring;
col = new aa.collection(new [] { "b", "b"});
// Used in question 2
aa.evGatherstringa += col.gatherstring;
Console.WriteLine(aa.gatherstring());
}
public static class aa
{
public delegate string gatherstringa();
public static event gatherstringa evGatherstringa;
public static string gatherstring() { return evGatherstringa.Invoke(); }
public class collection
{
public collection(string[] strings) { this.strings = strings; }
public string gatherstring()
{
return this.strings[0];
}
public string[] strings { get; set; }
}
}
}
輸出:
a
b
- 當改變代碼併除去退訂,Console.WriteLine命令輸出仍然是相同的。爲什麼會發生?爲什麼這不好?
static void Main()
{
aa.collection col = null;
col = new aa.collection(new [] { "a", "a"});
aa.evGatherstringa += col.gatherstring;
Console.WriteLine(aa.gatherstring());
// Used in question 1
//aa.evGatherstringa -= col.gatherstring;
col = new aa.collection(new [] { "b", "b"});
// Used in question 2
aa.evGatherstringa += col.gatherstring;
Console.WriteLine(aa.gatherstring());
}
輸出:
a
b
- 當改變代碼和除去兩個退訂和重新訂閱,Console.WriteLine命令輸出是不同的。爲什麼不是輸出
a
然後b
?
static void Main()
{
aa.collection col = null;
col = new aa.collection(new [] { "a", "a"});
aa.evGatherstringa += col.gatherstring;
Console.WriteLine(aa.gatherstring());
// Used in question 1 and 2
//aa.evGatherstringa -= col.gatherstring;
col = new aa.collection(new [] { "b", "b"});
// Used in question 2
//aa.evGatherstringa += col.gatherstring;
Console.WriteLine(aa.gatherstring());
}
輸出:
a
a
謝謝您的深入響應!兩個後續問題: ** 1a。**就你的q1迴應而言,如果在變量處置方面是_bad_,我更好奇。正如q2似乎表明的那樣,即使在將col設置爲新實例後,也不會刪除最初的「col」(及其訂閱)。這最終會導致內存泄漏,還是會撿起它? ** 2a。**至於q2,簡單地改變'strings'屬性本身而不是完全替換'col'會更有意義嗎?不完全確定爲什麼,但你的迴應帶來了這個想法。代碼:'col.strings = new [] {「b」,「b」};' – DisplayedName
@DisplayedName:請參閱我的「附錄」 –