Re:Stack Overflow open sources their ASP.net MVC mini profiler
by marcgravell on Thursday June 09, 2011 @07:32AM
(#2636747)
"Step" is a static-call to an extension method. This way allows your code to keep working fine (unchanged) for users that aren't profiling (i.e. 99.99% of the users).
Re:Stack Overflow open sources their ASP.net MVC mini profiler
by MatthewPhillips on Thursday June 09, 2011 @08:02AM
(#2636805)
I meant more the "it's ok if this is null" part. Does that comment not mean what I'm thinking it means? Because invoking a method on a null object will throw an exception.
Re:Stack Overflow open sources their ASP.net MVC mini profiler
by nick_craver on Thursday June 09, 2011 @08:21AM
(#2636840)
In the case of an extension method, it's actually just syntactic sugar the compiler provides. An extension method is actually a static method underneath, this allows null checking to be centralized, and cleaner everywhere a step is used. The method looks like this: "public static IDisposable Step(this MiniProfiler profiler, string name, ProfileLevel level = ProfileLevel.Info) { return profiler == null ? null : profiler.StepImpl(name, level); }"
Re:Stack Overflow open sources their ASP.net MVC mini profiler
by bitdiffusion on Thursday June 09, 2011 @08:22AM
(#2636844)
Extension methods can be invoked on null objects (the object gets passed to the static method and you can check for null in the extension itself).
Strange, but does enable some interesting syntactic sugar checking for empty values etc.
Re:Stack Overflow open sources their ASP.net MVC mini profiler
by MatthewPhillips on Thursday June 09, 2011 @01:14PM
(#2637858)
Nice. I've used extension methods from time to time but not in this way. Could prevent you from writing if foo != null a lot if you have an extension method by doing: public static bool Exists(this Foo foo) { return foo != null; }
So then you can say if(foo.Exists()) { foo.bar(); }
Or make Exists return an instance of Foo (foo if not null, a new Foo if not) and go with foo.Exists().bar();
using (profiler.Step("Set page title"))
huh?