2016-06-30 4 views
2

Ich habe protected override void OnFormClosing(FormClosingEventArgs e) in einigen meiner Code-und Code-Analyse gibt eine CA1062, weil ich nicht überprüfen, ob e Null ist.Können EventArgs jemals null sein?

Konvention ist, dass EventArgs niemals null sein sollte; deshalb haben wir EventArgs.Empty. Sicher, ich könnte dumm sein und null statt EventArgs.Empty übergeben, wenn ein Ereignis ausgelöst wird, aber hier wird es etwas automatisch generierten Code sein, der das FormClosing-Ereignis auslösen wird, so dass ich nur die Warnung unterdrückt.

Gibt es einige Fälle, in denen EventArgs vom Framework als null eingestuft werden kann und nicht vom Programmierer verursacht wird?

+1

'EventArgs' ist ein Referenztyp und es gibt keinen Schutz in C# gegen 'Null'-Werte auf Referenztypen. – Enigmativity

+1

[CA1062] (https://msdn.microsoft.com/en-us/library/ms182182.aspx) ist eine generische Warnung, Sie können sie deaktivieren/ignorieren, falls ** Sie ** niemals 'null' übergeben (weil Sie kann Unterklasse Formular und steigen Ereignis selbst, etc.). * Standard * [tag: winforms] -Ereignishandler sollten niemals "null" erhalten. – Sinatr

+0

Es sollte nicht null sein, da es an erster Stelle nur ausgelöst wird, wenn das Ereignis eintritt, also sind wir sicher, dass das Ereignis ausgelöst wird und wir erwarten, dass die Instanz dieses Ereignisses in unserem Listener – Sherlock

Antwort

5

Kurze Antwort: Ja, Sie können dies tun:

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

Aber wenn Sie tatsächlich etwas tun, können Sie die Warnung ignorieren.

Mit Blick auf den Quellcode für die Klasse Formular können wir this method finden, was diese wieder aufnimmt:

/// <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; 
    } 

Also nein, es gibt keinen Weg e wird null sein, wenn das Ereignis von WinForms angehoben wird.

+0

aber Ereignis Listener sollte nicht wie folgt aufgerufen werden: 3 – Sherlock

+0

Ich glaube, ein weiterer Fall, wenn dies möglich ist, ist Unterklassen (Event Risers sind geschützt und kann außer Kraft gesetzt werden, wo Sie Ereignis mit 'null' erheben können) – Sinatr

+0

Ja, sicher. Aber ich meinte einen Fall, der durch winforms selbst verursacht wurde, nicht irgendein Mist, den ich geschrieben habe. –