该方法是使用空值调用还是给出空引用异常?

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

如果是这样的话,我将永远不需要检查我的“this”参数为空?


当前回答

除了Marc Gravell的正确答案。

如果this参数明显为null,你可能会从编译器得到警告:

default(string).MyExtension();

在运行时运行良好,但产生警告“Expression将始终导致System. exe”。NullReferenceException,因为string的默认值是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);
}

etc

从根本上说,对静态调用的调用是非常字面化的。

string s = ...
if(s.IsNullOrEmpty()) {...}

就变成:

string s = ...
if(YourExtensionClass.IsNullOrEmpty(s)) {...}

这里显然没有空检查。

extensionmethod是静态的,所以如果你不给这个MyObject添加任何东西,这应该不是问题,一个快速的测试应该可以验证它:)

myObject.MyExtensionMethod ();当myObject为空时,将永远不会抛出空引用异常…但是,如果MyExtensionMethod()没有正确地处理null,它将抛出异常。

https://dotnetfiddle.net/KqwLya

一个空值将被传递给扩展方法。

如果该方法试图访问该对象而不检查它是否为空,则是,它将抛出异常。

一个家伙在这里写了“IsNull”和“IsNotNull”扩展方法,检查引用是否传递为空。就我个人而言,我认为这是一种偏差,不应该被看到,但这是完全有效的c#。

除了Marc Gravell的正确答案。

如果this参数明显为null,你可能会从编译器得到警告:

default(string).MyExtension();

在运行时运行良好,但产生警告“Expression将始终导致System. exe”。NullReferenceException,因为string的默认值是null"。