在C#中,当您在空对象上调用扩展方法时会发生什么?

该方法是否使用空值调用,或者是否给出空引用异常?

MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?

如果是这种情况,我将永远不需要检查我的'this'参数为null?


这将工作正常(没有例外)。 扩展方法不使用虚拟调用(即它使用“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)) {...}

那里显然没有空检查。


除了Marc Gravell的正确答案之外。

如果显然这个参数是空的,你可以从编译器得到一个警告:

default(string).MyExtension();

运行时运行良好,但会产生警告"Expression will always cause a System.NullReferenceException, because the default value of string is null"


null将被传递给扩展方法。

如果该方法试图访问该对象而不检查它是否为空,那么是的,它会抛出一个异常。

这里的一个人写了“IsNull”和“IsNotNull”扩展方法,检查是否传递null参考。 就我个人而言,我认为这是一个畸变,不应该看到白天,但它是完全有效的C#。

链接地址: http://www.djcxy.com/p/96943.html

上一篇: In C#, what happens when you call an extension method on a null object?

下一篇: Creating a circularly linked list in C#?