该方法是使用空值调用还是给出空引用异常?
MyObject myObject = null; myObject.MyExtensionMethod(); // <-- is this a null reference exception?
如果是这种情况,我将永远不需要检查我的“this”参数是否为空?
这将正常工作(没有例外)。扩展方法不使用虚拟调用(即它使用“call” il 指令,而不是“callvirt”),因此没有空值检查,除非您自己在扩展方法中编写它。这在某些情况下实际上很有用:
public static bool IsNullOrEmpty(this string value) { return string.IsNullOrEmpty(value); } public static void ThrowIfNull<T>(this T obj, string parameterName) where T : class { if(obj == null) throw new ArgumentNullException(parameterName); }
等等
从根本上说,对静态调用的调用是非常直接的——即
string s = ... if(s.IsNullOrEmpty()) {...}
变成:
string s = ... if(YourExtensionClass.IsNullOrEmpty(s)) {...}
显然没有空检查。