# 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

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.