Methoden im NULL-Verweis im Kontext einer using-Klausel aufzurufen, ist OK?

8

Ich habe mir den mvc-mini-Profiler angesehen, der vom Stack Overflow-Team auf Google Code entworfen wurde, und eine Sache auf Anfang Seite erschien mir als besonders seltsam:

%Vor%

Wie kann es "ok" sein, wenn profiler null ist? Es scheint mir, dass das Aufrufen von Step einen NullReferenceException werfen würde. In all den Jahren, in denen ich C # programmiert habe, habe ich nie gewusst, dass eine Methode für eine NULL-Referenz in irgendeinem Kontext "ok" sein könnte. Ist das ein Sonderfall im Zusammenhang mit einer using-Klausel?

Ich kann verstehen, dass es in Ordnung ist (wusste es nicht, aber anscheinend ist es das?):

%Vor%

, aber das Aufrufen einer Methode für eine NULL-Referenz scheint so zu sein, als ob sie eine Ausnahme auslösen sollte, unabhängig davon, ob sie sich in einer using-Klausel befindet. Kann jemand bitte erklären, wie solch ein Konstrukt hinter die Kulissen übersetzt wird, damit ich verstehen kann, warum es in Ordnung ist, dies zu tun?

    
Jake Petroules 10.07.2011, 06:57
quelle

3 Antworten

12

Es ist absolut nicht OK, wenn profiler null ist , es sei denn profiler.Step ist eigentlich eine Erweiterungsmethode. Die using -Anweisung hat keinen Einfluss darauf.

Wie sich herausstellt, ist der Teil der Erweiterungsmethode genau das, was vor sich geht. Zeilen 584-587 von MiniProfiler.cs:

%Vor%

So ist es in Ordnung, wenn profiler.Step aufgerufen wird, wenn profiler null ist. Es ist keine Instanzmethode - der Aufruf lautet:

%Vor%

Es ist in Ordnung für profiler.Step to return null, wie im zweiten Teil Ihrer Frage.

    
Jon Skeet 10.07.2011, 07:03
quelle
5

Step muss eine Erweiterungsmethode sein war meine Vermutung in dem Kommentar.

Sonst ist entweder dein Compiler verstümmelt oder du halluzinierst. : -)

    
Mehrdad 10.07.2011 07:04
quelle
1

Wow, so eine gute Frage. Meine erste Reaktion war "natürlich ist das nicht gut" ... aber ich tippte es in VS2010 und schien glücklich.

Ich habe eine mögliche Antwort für Sie gefunden (macht mich das zu einem Proxy?): Anweisung mit einem Null-Objekt verwenden

Wenn ich es wäre, würde ich einen Komponententest schreiben, um dieses Verhalten zu validieren, damit der Test fehlschlägt, wenn er sich in Zukunft ändert.

Bis ja

    
Rob Smyth 10.07.2011 08:15
quelle

Tags und Links