# Is this is good way to check for null?

I ran into the code below today, and my gut instinct tells me this is an expensive way to do a null check. The point the author was making was that if you changed the name of the object then you don't need to change the value of the string being thrown in the exception.

The proposed use would be:

string cantBeNull=...;
Guard.IsNotNull(cantBeNull);
if(cantBeNull == null) throw new ArgumentNullException("cantBeNull");


So Is this an acceptable way of checking for null? Is this overly expensive just to save you from not having the change the value passed to the exception?

Code in question:

public static void IsNotNull<T>(Expression<Func<T>> expression) where T : class
{
if (expression == null)
throw new ArgumentNullException("expression");

var value = expression.Compile()();
var param = (MemberExpression)expression.Body;
var paramName = param.Member.Name;

if (value != null)
return;

throw new ArgumentNullException(paramName);
}

-
I have a feeling this will be close to an order of magnitude slower than a simple null check. Yes, overly expensive. –  Jesse C. Slicer Nov 26 '12 at 19:45
I feel like the next logical step for this code is to make it an extension method so you can just do a cantBeNull.IsNotNull() :) –  Joe Nov 27 '12 at 16:22

How often do you change parameter names? How often does the code run? Under any normal distribution of those, you should go with a minor code efficiency gain over a programmer efficiency gain.

On the other hand, if you (for some bizarre reason) change the parameter name almost every time the code runs, the tradeoff is probably worth it.

But just remember, that whether or not the string matches the actual parameter name, it should still let you find exactly which parameter was null so long as there isn't anywhere else in that function which throws an ArugmentNullException with the same string.

-
Why would you change the parameter name almost every time the code runs? Apart from that, good answer! –  jpfollenius Nov 27 '12 at 7:13
@Smasher - I really don't know, but that's the only scenario I could think of where dynamically pulling the parameter name would make sense. I suppose there could be some business logic reason to do so? –  Bobson Nov 27 '12 at 14:58
How could business logic affect your code? That doesn't make sense. Maybe the content changes each time but not the name of the parameter itself. –  jpfollenius Nov 27 '12 at 15:16
@Smasher - Business logic may not have been the right term - I'm thinking of something ridiculous like "Our coding standard says that all parameter names need to have the last date the function was edited appended in _20121127 format". –  Bobson Nov 27 '12 at 16:20