2016-06-30 37 views
2

我在我的一些代碼中有protected override void OnFormClosing(FormClosingEventArgs e),代碼分析給出了CA1062,因爲我不檢查e是否爲空。EventArgs是否可以爲空?

約定是EventArgs不應該爲空;這就是爲什麼我們有EventArgs.Empty。當然,我可能是愚蠢的,並且在引發一些事件時通過null而不是EventArgs.Empty,但是在這裏它將是一些自動生成的代碼,它們將引發FormClosing事件,所以我只是壓制了警告。

是否存在一些可能導致EventArgs在框架中爲null並且不是由程序員造成的情況?

+1

'EventArgs'是一個引用類型,C#沒有針對引用類型的'null'值保護。 – Enigmativity

+1

[CA1062](https://msdn.microsoft.com/en-us/library/ms182182.aspx)是通用警告,您可以禁用/忽略它,以防**你**從不傳遞null(因爲你可以繼承自己的形式並自發上升事件等)。 *標準* [tag:winforms]事件處理程序不應該收到'null'。 – Sinatr

+0

它不應該爲空,因爲首先它只會在事件發生時觸發,所以我們確信事件觸發,並且我們期望在我們的偵聽器中發生該事件的實例。 – Sherlock

回答

5

簡短的回答:是的,你可以這樣做:

public void DoSomething() 
{ 
    OnFormClosing(null); 
} 

但除非你真正做這樣的事情,你可以忽略警告。

縱觀類形式的源代碼,我們可以發現this method,從而恢復到這一點:

/// <devdoc> 
    /// <para>Raises the FormClosing event for this form when Application.Exit is called. 
    ///   Returns e.Cancel returned by the event handler.</para> 
    /// </devdoc> 
    internal bool RaiseFormClosingOnAppExit() { 
     FormClosingEventArgs e = new FormClosingEventArgs(CloseReason.ApplicationExitCall, false); 
     OnFormClosing(e); 
     return e.Cancel; 
    } 

因此,沒有,沒有辦法e當事件被引發的WinForms將是無效的。

+0

但事件監聽器不應該這樣調用:3 – Sherlock

+0

我相信另一種情況,這是可能的是子類化(事件risers被保護,可以被覆蓋,你可以用'null' ) – Sinatr

+0

是的,當然。但我的意思是一些由winforms本身引起的角落案件,而不是我寫的一些廢話。 –

相關問題