2017-09-01 27 views
0

古怪我一直沒能找到答案在文檔或網頁上,雖然這似乎是一個簡單的問題:C#事件,註銷,恕不另行寄存器

想象我註冊一個C#事件在條件塊:

void Execute() 
{ 
    if(loader.AlreadyCompleted) 
    { 
     DoSomething(); 
    } 
    else 
    { 
     loader.Completed += DoSomething; 
    } 
} 

在本例中,加載器將觸發Completed事件。如果它已經發生AlreadyCompleted將是真實的,否則它是假的,我想註冊Completed事件以便在執行DoSomething之前等待。

現在想象我有一箇中止功能,可以隨時觸發。 在中止功能中,我需要從Completed事件中取消註冊。

void Abort() 
{ 
    loader.Completed -= DoSomething; 
} 

會發生什麼,如果裝載機正準備啓動時,我們從來沒有執行的行loader.Completed += DoSomething;我們可以註銷尚未註冊的活動嗎?有沒有辦法檢查我們是否已註冊?這種情況下的最佳做法是什麼?

+0

你還試過嗎?這個問題對我來說過於理論化,這使得它太寬泛了。 –

+0

我在詢問時沒有嘗試過。由於我沒有在StackOverflow中找到答案,所以我決定詢問,因爲我當然不是唯一一個正在尋找這個信息的人,所以讓這裏的信息可能會有所幫助。我只是看到它是重複的。這是因爲我用「註冊」而不是「訂閱」來搜索,我的錯誤 –

+0

請閱讀[mcve]是什麼。 –

回答

2

如果您嘗試註銷一個從未註冊的事件,則不會發生任何事情。這是因爲當您撥打loader.Completed -= DoSomething;時,這實際上只是說loaded.Completed = (Completed)Delegate.Remove(DoSomething)。 當您嘗試刪除從未添加或不存在的事件處理程序時,Delegate.Remove將僅返回空值,該值將設置loaded.Complete = null

+0

要支持此檢查[此在線示例](http://rextester.com/RGA8745) –