2011-07-10 23 views
8

tôi đang tìm kiếm tại MVC-mini-profiler được thiết kế bởi đội Stack Overflow trên Google Code và một điều trên trang getting started đánh tôi như đặc biệt kỳ lạ:Phương pháp gọi trên tham chiếu null trong ngữ cảnh của mệnh đề đang sử dụng là OK?

var profiler = MiniProfiler.Current; // it's ok if this is null 

using (profiler.Step("Set page title")) 
{ 
    ViewBag.Title = "Home Page"; 
} 

Làm thế nào nó có thể là "ok" nếu hồ sơ là null? Dường như tôi gọi Step sẽ ném một số NullReferenceException. Trong tất cả các năm của tôi lập trình C# Tôi đã không bao giờ được gọi là một phương pháp trên một tham chiếu null trong bất kỳ ngữ cảnh được "ok". Đây có phải là trường hợp đặc biệt trong ngữ cảnh sử dụng không?

tôi có thể hiểu được điều này là OK (không biết nó là gì, nhưng dường như nó là gì?):

using (null) 
{ 
    ... 
} 

nhưng gọi một phương thức trên một tham chiếu null có vẻ như nó nên ném một ngoại lệ cho dù nó trong mệnh đề sử dụng. Ai đó có thể vui lòng giải thích cách một cấu trúc như vậy được dịch phía sau hậu trường, vì vậy tôi có thể hiểu tại sao nó là OK để làm điều này?

+0

'Phương pháp mở rộng' hoặc phương pháp thể hiện? – Mehrdad

+0

Bah. Nếu như vậy sẽ giải thích mọi thứ ... –

+2

Đúng. Nó là. Đừng bận tâm. –

Trả lời

12

Nó hoàn toàn không OK nếu profiler là null trừprofiler.Step thực sự là một phương pháp khuyến nông. Tuyên bố using không ảnh hưởng đến điều đó.

Khi nó quay ra, phần phương pháp mở rộng là chính xác những gì đang xảy ra. Dòng 584-587 của MiniProfiler.cs:

public static IDisposable Step(this MiniProfiler profiler, string name, 
           ProfileLevel level = ProfileLevel.Info) 
{ 
    return profiler == null ? null : profiler.StepImpl(name, level); 
} 

Đó là cách nó okay cho profiler.Step để được gọi khi profiler là null. Nó không phải là một phương pháp dụ - các cuộc gọi dịch để:

MiniProfilerExtensions.Step(profiler, ...); 

Đó là tốt cho profiler.Step-trở null, theo phần thứ hai của câu hỏi của bạn.

+2

Facepalming bây giờ sau khi Mehrdad hỏi liệu Bước là một phương pháp mở rộng và tôi nhận ra nó được. Cảm ơn cả hai. :) –

5

Step phải là extension method, như tôi đoán trong nhận xét.

Nếu không trình biên dịch của bạn bị cắt xén hoặc bạn đang bị ảo giác. :-)

+2

+1 cho phần đóng dí dỏm. :) –

1

Ồ, một câu hỏi hay. Phản ứng đầu tiên của tôi là "tất nhiên là không tốt" ... nhưng tôi đã gõ nó vào VS2010 và có vẻ hạnh phúc.

Tôi tìm thấy một câu trả lời có thể cho bạn (Điều đó làm cho tôi một proxy câu trả lời?) Ở đây: Using statement with a null object

Nếu là tôi, tôi sẽ viết một bài kiểm tra đơn vị để xác nhận hành vi này để nếu nó mỗi thay đổi trong tương lai thử nghiệm sẽ thất bại.

Xem ya

Các vấn đề liên quan