WARNING: THIS CODE SUCKS, SEE ANTHONY’S COMMENTS
Which is faster?
1.
public bool IsValueType<T>(T obj){
return obj is ValueType;
}
2.
public bool IsValueType<T>(T obj){
return obj == null ? false : obj.GetType().IsValueType;
}
3.
public bool IsValueType<T>(T obj){
return default(T) != null;
}
4.Something else
You aren’t really testing an object – you want to test the type. To call those, the caller must know the type, but… meh. Given a signature
<T>(T obj)the only sane answer is:or if we want to use an example object for type inference purposes:
this doesn’t need boxing (
GetType()is boxing), and doesn’t have problems withNullable<T>. A more interesting case is when you are passingobject…here, we already have massive problems with
null, since that could be an emptyNullable<T>(a struct) or a class. But A reasonable attempt would be:but note that it is incorrect (and unfixable) for empty
Nullable<T>s. Here it becomes pointless to worry about boxing as we are already boxed.